同じパスのファイルを同時に空にするにはどうすればいいですか?

同じパスのファイルを同時に空にするにはどうすればいいですか?

次のような構造があります:

Father:
├───Charlie
│    └───lang.log
├───Ava
│    └───lang.log
├───Sophia
│    └───lang.log
...

スキームを整理したいと思います。次のことを試します。

cat /dev/null > Father/*/lang.log

しかし、このエラーが発生します:

-bash: */lang.log: あいまいなリダイレクト

すべてのファイルを同時に空にするにはどうすればいいでしょうか? おそらく 1 つのコマンドで。

答え1

POSIX ソリューション、基本:

find Father/ -type f -name lang.log -exec sh -c 'true > "$1"' sh {} \;

… -exec true > {} \;機能しないので、内側のシェルが必要ですリダイレクトのためシェル部分はそうではないことに注意してください。sh -c 'true > {}'このバージョンは欠陥のある


POSIX ソリューションでは、一致するファイルが多い場合に生成されるプロセスが少なくなるため、速度が向上しますsh

find Father/ -type f -name lang.log -exec sh -c 'for f; do true > "$f"; done' sh {} +

truncate多数のオペランドを受け取ることができる場合( truncatePOSIX では必須ではないことに注意してください):

find Father/ -type f -name lang.log -exec truncate -s 0 -- {} +

--はここでは過剰です。なぜなら、この特定のケースでは、 から来るすべてのパスはfindで始まる必要があるFather/ため、それらのいずれかがオプションとして偽装されるリスクはありません。ただし、一般的には、--オンザフライで生成される before オペランドを使用することは良い方法です。

答え2

それを実行するには、次を使用しますxargs

find . -name lang.log | xargs -I {} sh -c "cat /dev/null > {}"

これにより、その名前のファイルがすべて検索され、各ファイルに対して が実行されますcat /dev/null > <filename>

関連情報