解決
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
ます。