我有一个读取文件并输出修改版本的命令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
,它有效。