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