循环遍历具有特定扩展名的所有文件并在其上执行某些操作

时间:2013-10-16 23:16:08

标签: linux bash shell find

这是我使用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

2 个答案:

答案 0 :(得分:6)

  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的值是文件名,因为我们通过sh将其作为第一个参数传递给{}找到并剥离尾随的“.ext1”。我们将“.ext2”附加到结果字符串以获取所需的输出文件。

答案 1 :(得分:4)

bash 4或更高版本中,您可以利用默认设置的globstar选项。

for file in **/*.ext1; do
    executable -option1 -option2 "$file" > "${file%.ext1}".ext2
done