-name に続くパターンが引用符で囲まれていない場合、find の動作がおかしくなる

-name に続くパターンが引用符で囲まれていない場合、find の動作がおかしくなる

非常に奇妙なことに、find の次の -name パターンを使用すると、対応するファイル名がすべて予期せず正常に検索される場合があります。本来であれば、シェル解析 (引用符のない find ユーティリティではありません) を介して現在のディレクトリ内の対応するファイル名を 1 つだけ検索できます。

find /tmp -type f -name *.txt

/tmp/amp_iostat.txt
/tmp/awrrpt_1_7950_7973.txt
/tmp/oplanlog/osys/2014-07-01-12-26-28/log.txt
/tmp/oplanlog/osys/2014-07-01-13-15-33/log.txt
/tmp/oplanlog/osys/2014-07-01-13-17-58/log.txt
/tmp/oplanlog/osys/2014-07-01-13-30-27/log.txt
/tmp/oplanlog/osys/2016-10-27-19-38-50/log.txt
/tmp/pms2_20170427.txt
/tmp/pmsdb1_20170622.txt
/tmp/pmssh1_20160728.txt
/tmp/pmssh1_20160831.txt
/tmp/pmssh1_20161227.txt
/tmp/pmssh1_20170328.txt
/tmp/pmssh1_20170523.txt
/tmp/pmssh1_20170727.txt
/tmp/pmssh1_20170822.txt
/tmp/pmssh2_20170328.txt
/tmp/pmssh_20170119.txt
/tmp/pmssh_20170220.txt
/tmp/sgpms_20140717_1736_summary.txt
/tmp/sgpms_20140717_1736_trace.txt
/tmp/sgpms_20140717_1737_summary.txt
/tmp/sgpms_20140717_1737_trace.txt
/tmp/sgpms_20140717_1739_summary.txt
/tmp/sgpms_20140717_1739_trace.txt
/tmp/sgpms_20140717_1743_summary.txt
/tmp/sgpms_20140717_1743_trace.txt
/tmp/sgpms_20140717_1749_summary.txt
/tmp/sgpms_20140717_1749_trace.txt
/tmp/sgpms_20140717_1751_summary.txt
/tmp/sgpms_20140717_1751_trace.txt

find /tmp -type f -name *.txt|wc -l
      31

答え1

引用なしで*.txtパス名拡張(別名ファイル名拡張)これは、現在の作業ディレクトリ(CWD)。CWD に拡張子 'txt' のファイルが含まれている場合、findシェルを呼び出す前に*.txtパラメータが一致するファイル名に置き換えられ、コマンドは次のようになります。

find /tmp -type f -name file1.txt file2.txt file3.txt ...

拡張が返されるかどうかに応じて、少なくとも 3 つの結果が得られます...

  • ...複数のファイル:エラーが発生します
  • ... 1 つのファイルとその名前が、実行中のパス内のファイル名と一致しますfindテスト-nameは1つのファイルのみに一致します
  • ... 1 つのファイルがあり、検索パス内のどのファイルとも一致しません。 -name何も一致しません

一方、CWDがないtxt ファイルが含まれていない場合は*.txt渡されfind、引用符で囲んだ場合とまったく同じように動作します。

教訓: を使用する場合は、find実際にパス名の拡張が発生することを望まない限り、常に glob を含むパターンを引用符で囲みます (この-nameオプションで意図的にこれを行うことはめったにありません)。

関連情報