1

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

2 回答 2

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: 它必须完全按照{}.

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

于 2013-10-16T23:18:19.120 回答
5

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

for file in **/*.ext1; do
    executable -option1 -option2 "$file" > "${file%.ext1}".ext2
done
于 2013-10-17T12:09:23.727 回答