ファイルを読み取り、修正版を出力するコマンドがあります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
効果がありました。