【问题标题】:Looping through all files with specific extension and execute something on them循环遍历具有特定扩展名的所有文件并在它们上执行某些操作
【发布时间】:2013-10-25 06:51:47
【问题描述】:

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

【问题讨论】:

    标签: linux bash shell find


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:
        find . -name '*.ext1' -type f -exec sh -c \
          'executable -option1 -option2 ${0} > ${0%.ext1}.ext2' {} \;
      

      find 是递归遍历文件树的标准工具。第一个参数(在本例中为“.”,表示当前工作目录)指定开始下降的树的基础。 -name 参数将搜索范围限制为与给定文件名匹配的文件。 -type f 进一步将搜索限制为常规文件(而不是目录或其他实体)。 -exec 选项指示 find 对它找到的与之前的规范匹配的每个文件(名称以“.ext1”结尾的常规文件)执行指定的命令 我们使用 sh 来执行命令,而不是直接调用可执行文件2 个原因:很容易操作文件名,并且因为它不是严格可移植的,甚至尝试使用 find 操作文件名:它必须完全按照 {} 给出。

      ${0%.ext1} 是 shell 语法,它接受文件名($0 的值是文件名,因为我们将它作为第一个参数通过 {} 在 find 中传递给sh)并去掉尾随的“ .ext1”。我们将“.ext2”附加到该结果字符串以获取所需的输出文件。

      【讨论】:

        猜你喜欢
        • 2013-01-08
        • 1970-01-01
        • 2014-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-27
        • 2019-03-02
        相关资源
        最近更新 更多