🐧 Linux 総合学習プラットフォーム

find -name のパターンを引用符で囲まず、シェルが先に展開して意図しない検索になる

症状(よく出るエラー)

find . -name *.log と打つと find: paths must precede expression というエラーになったり、エラーは出ないのにカレント直下の1ファイルしかヒットしない。-delete を組み合わせていた場合、消す対象がずれる。

原因

引用符のない *.log は、find に渡る前にシェルのパス名展開(グロブ)で処理される。カレントディレクトリに .log ファイルが複数あると app.log error.log ... のように展開されて find の文法エラーになり、1個だけあるとその名前に固定されてサブディレクトリの検索条件が「その1ファイル名と完全一致」にすり替わる。つまり find が受け取るパターンが実行のたびに変わる、という不安定さが事故の元。

直し方

パターンは必ず find . -name '*.log' のようにシングルクォートで囲み、シェルに触らせず find 本体に渡す。削除を伴うときは、まず -delete を外して find . -name '*.log' で対象一覧を目視し、問題なければ find . -name '*.log' -delete を実行する二段構えにする。

▶ 学習アプリでしっかり学ぶ