ディレクトリ内のすべてのファイルを変更するコマンドを再帰的に適用する

ディレクトリ内のすべてのファイルを変更するコマンドを再帰的に適用する

ファイルを読み取り、変更されたバージョンを出力するコマンドがありますstdout:

./convert /path/to/file

このコマンドをディレクトリ内のすべてのファイルに再帰的に適用するにはどうすればいいでしょうか?上記のコマンドの結果で各ファイルの既存の内容を上書きします。?

私は見つけたこの質問これは非常に似ていますが、提供されるすべてのソリューションでは、結果を 1 つのファイルに出力することが必要であり、これは私が望んでいることではありません。

答え1

私の理解が正しければ、1つのファイルを

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

ディレクトリツリー内のすべてのファイルにコマンドを適用するには、findユーティリティ。ファイルごとに複雑なコマンドを実行する必要があるため、明示的にシェルを呼び出す必要があります。

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

答え2

リンク先の質問は再帰的に動作せず、1 レベルの深さでのみ動作します。再帰の場合は、次を使用します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、うまくいきました。

関連情報