ディレクトリ内のすべてのファイルを変更するには、コマンドを繰り返し適用します。

ディレクトリ内のすべてのファイルを変更するには、コマンドを繰り返し適用します。

ファイルを読み取り、修正版を出力するコマンドがありますstdout

./convert /path/to/file

このコマンドをディレクトリ内のすべてのファイルにどのように繰り返し適用できますか?上記のコマンドの結果として、各ファイルの既存の内容が上書きされます。

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

答え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効果がありました。

関連情報