递归应用命令来修改目录中的所有文件

递归应用命令来修改目录中的所有文件

我有一个读取文件并输出修改版本的命令stdout

./convert /path/to/file

如何将此命令递归地应用于目录中的所有文件,以及使用上述命令的结果覆盖每个文件的现有内容

我发现这个问题这非常相似,但提供的所有解决方案都涉及将结果输出到单个文件,这不是我想要的。

答案1

如果我理解正确的话,您可以使用以下命令转换一个文件

./convert /path/to/file >/path/to/file.new
mv /path/to/file.new /path/to/file

要将命令应用于目录树中的每个文件,请使用find公用事业。由于您需要对每个文件执行复杂的命令,因此需要显式调用 shell。

find /path/to/top/directory -type f -exec sh -c '
  /path/to/convert "$0" >"$0.new" &&
  mv "$0.new" "$0"
' {} \;

答案2

您链接到的问题不会递归运行,它仅适用于一层深度。对于递归,请使用find

find . -type f -exec /path/to/convert {} \;

你想把convert自己移出你正在行走的树,因为它有尝试修改自己的风险。

答案3

convert如果我理解正确,您想用该输入文件的结果覆盖每个输入文件。如果是这样,请尝试以下操作:

find . -type f | while IFS= read -r file; do
  ./convert "$file" > /tmp/foo.tmp && mv /tmp/foo.tmp "$file";
done

答案4

借用@Gilles 的优秀作品回答:

find /path/to/top/directory -type f -exec sh -c '/path/to/convert "$0" | tee "$0"' {} \;

我尝试了上面的方法sed,它有效。

相关内容