
我有一個讀取文件並輸出修改版本的命令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
,它有效。