遞歸應用指令來修改目錄中的所有文件

遞歸應用指令來修改目錄中的所有文件

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

相關內容