4

30MB以上のファイルを空にしたい。findコマンドを使ってそれを解決しようとしました。

   find . -maxdepth 1 -size +32M -exec cat /dev/null > {} \;

   find . -maxdepth 1 -size +32M -exec echo -n > '{}' \;

ただし、どちらのコマンドもファイルを空にしません。代わりに、{}ファイルを作成します。

なぜファイルを空にしないのですか?そしてなぜそれが?と呼ばれるファイルを作成するの{}か。コマンドの何が問題になっていfindますか?

4

1 に答える 1

7

解決

sh -cこの場合、次を使用する必要があります。

 -exec sh -c "> {}" \;

使用例

ファイルの準備:

$ echo hello > a1
$ cp a1 a2; cp a1 b1; cp a1 b2
$ ls -l
total 16
-rw-r--r-- 1 ic ic 6  6. Aug 14:45 a1
-rw-r--r-- 1 ic ic 6  6. Aug 14:45 a2
-rw-r--r-- 1 ic ic 6  6. Aug 14:45 b1
-rw-r--r-- 1 ic ic 6  6. Aug 14:45 b2

コマンドの実行:

$ find . -name 'a*' -exec sh -c '> {}' \;

結果の確認:

$ ls -l
total 8
-rw-r--r-- 1 ic ic 0  6. Aug 14:45 a1
-rw-r--r-- 1 ic ic 0  6. Aug 14:45 a2
-rw-r--r-- 1 ic ic 6  6. Aug 14:45 b1
-rw-r--r-- 1 ic ic 6  6. Aug 14:45 b2
$ cat a1
$ cat b1
hello

ご覧のとおり、で始まるファイルはa空になっています。および他のファイルはそうではありません。

説明

あなたが次のようなものを作るとき

find . -maxdepth 1 -size +32M -exec cat /dev/null > {} \;

このリダイレクトは、execコマンドの内側ではなく、コマンドの外側で行います。

( find . -maxdepth 1 -size +32M -exec cat /dev/null )  ===> ( {} \; )

もちろん、それは正しくありません。このリダイレクトは、によって実行されるコマンド内で行う必要がありますfind。これを行うには、コマンド内で新しいシェルを実行する必要がありますexec。これはを使用して作成しsh -cます。

于 2012-08-06T12:44:01.707 に答える