[英]Looping through all files with specific extension and execute something on them
这是我使用Linux Shell脚本的第一个小时,它看起来确实很强大,但是我仍然有些困惑。
我想递归遍历目录中具有特定扩展名的所有文件(所有子目录,子子目录和...),并通过在它们上运行可执行文件来生成一个具有相同名称但原始文件确切位置具有不同扩展名的新文件。
以下是它的伪代码:
files = list of all files (full path not just names) with extension .ext recursively
for file in files
executable -option1 -option2 fullpath/file.ext1 > fullpath/file.ext2
find . -name '*.ext1' -type f -exec sh -c \
'executable -option1 -option2 ${0} > ${0%.ext1}.ext2' {} \;
find
是用于递归遍历文件树的标准工具。 第一个参数(在本例中为“。”,表示当前工作目录)指定了开始下降的树的基础。 -name
参数将搜索范围限制为与给定文件名匹配的文件。 -type f
进一步将搜索限制为常规文件(与目录或其他实体相对)。 -exec
选项指示find在找到的每个与先前规范匹配的文件(名称以“ .ext1”结尾的常规文件)上执行指定的命令。出于以下两个原因,我们使用sh
来执行命令而不是直接调用可执行文件:它很容易操作文件名,并且因为它甚至不尝试使用find
来操作文件名也不是完全可移植的:必须将其精确地指定为{}
。
${0%.ext1}
是使用文件名的shell语法( $0
的值是文件名,因为我们通过find中的{}
将它作为sh
的第一个参数传递给了它)并去除了结尾的“ .ext1”。 我们将“ .ext2”附加到结果字符串中,以获得所需的输出文件。
在bash
4或更高版本中,您可以利用默认设置的globstar
选项。
for file in **/*.ext1; do
executable -option1 -option2 "$file" > "${file%.ext1}".ext2
done
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.