findコマンドでexecを使用中にエラーが発生しました。

findコマンドでexecを使用中にエラーが発生しました。

Linux システムのすべてのユーザーのすべてのメールを削除するには、次の手順を実行します。

find /var/spool/mail/ -regextype sed -regex "^.*[^/]$" -exec :> {} \;

...しかし、次のエラーメッセージが表示されます。

find: ‘:’: No such file or directory
find: ‘:’: No such file or directory
find: ‘:’: No such file or directory

何が問題なの?

答え1

ここで正規表現を使用するのはなぜですか?なぜそれを使用しないのですかfind /var/spool/mail/ -type f-maxdepth 1サブディレクトリへの再帰を防止したい場合に使用します。

また、削除できるユーザーメールボックスを切り捨てるのはなぜですか?例えば

find /var/spool/mail/ -type f -delete

または

find /var/spool/mail/ -type f -exec rm {} +

ユーザーが新しいメールを受信すると、MTA または MDA は必要に応じて正しい所有権と権限を使用して mbox ファイルを作成します。

答え2

すべてのユーザーのメールボックスを切り取るようです。外部ユーティリティ(シェル組み込みユーティリティ)ではないため、コール:ではこれを行うことはできません。代わりに使用すると、通常は外部コマンドとして使用できるため動作しますが...find:true:

また、経由で実行されるコマンドにはリダイレクトを使用できません。-execリダイレクトは、ユーティリティが最初に起動されたときにシェルによって実行されるためですfind(検出された各ファイルに対して1回ではありません)。

あなたの命令は本質的に次のとおりです

find /var/spool/mail/ -regextype sed -regex "^.*[^/]$" -exec : \; >{}

つまり、{}標準出力ストリームがfindリダイレクトされる名前のファイルを生成します。

代わりに、次の操作を実行できます。

find /var/spool/mail -type f -exec sh -c '
    for pathname do
        : >"$pathname"
    done' sh {} +

「一行」で:

find /var/spool/mail -type f -exec sh -c 'for pathname do : >"$pathname"; done' sh {} +

または、すべてのメールボックスがすぐ下にある場合/var/spool/mail

for pathname in /var/spool/mail/*; do
    : >"$pathname"
done

「一行」で:

for pathname in /var/spool/mail/*; do : >"$pathname"; done

どちらのバリエーションも、:ユーティリティが正しく呼び出され、見つかったすべてのパス名(指定された検索パスの内側または下の一般的なファイル)に対してリダイレクトされます。

関連:

関連情報