
非常に奇妙なことに、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
オプションで意図的にこれを行うことはめったにありません)。