危険察知4 択難易度 応用

状況

/var/log/app の中の .log ファイルだけを削除したい。作業者がコマンドを打ち、Enter を押す直前。

Enter の前に止めるべき点は?

$ sudo find /var/log/app -delete -name "*.log"

正答

  1. "*.log" はシングルクォートにしないとシェルが展開してしまう
  2. -delete が -name より前にあり、名前に関係なくすべて消える
  3. -type f を付けないと、.log という名前のディレクトリも消える
  4. 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

bashfinddelete

この問題を含む 危険察知 のテストを制限時間つきで解く

危険察知クイズへ