状況
/var/log/app の中の .log ファイルだけを削除したい。作業者がコマンドを打ち、Enter を押す直前。
Enter の前に止めるべき点は?
$ sudo find /var/log/app -delete -name "*.log"正答
- "*.log" はシングルクォートにしないとシェルが展開してしまう
- -delete が -name より前にあり、名前に関係なくすべて消える
- -type f を付けないと、.log という名前のディレクトリも消える
- find の -delete は GNU 版にしかないので
xargs rmを使うべき
解説
find の式は左から順に評価され、-delete は実行すると真を返す動作でもある。-delete を -name より前に書くと、名前を判定する前にすべてのファイルとディレクトリを消してしまい、/var/log/app 以下が丸ごと消える。GNU find のマニュアルもこの誤りを名指しで警告している。正しくは find /var/log/app -name "*.log" -delete で、まず -delete を -print に替えて対象を確かめる。ダブルクォートでもグロブ展開は止まるので 1 番目は誤り。
参考: www.gnu.org
この問題を含む 危険察知 のテストを制限時間つきで解く
危険察知クイズへ