
ファイルを読み取り、変更されたバージョンを出力するコマンドがあります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
、うまくいきました。