業務で、linuxでのファイル検索時に「照合パターンに合いません」と出力される件で質問があったので、記事ネタとして作成してみました。
検索対象に「*」を指定する際は、「’」(「”」)でくくろう
検索対象に「*」を指定してたんですけど、「’」で括ることで解消しました。
$ find ./ -name *.txt
find: 照合パターンに合いません
⇒NGケース
$ find ./ -name '*.txt'
./file0.txt
・・・
⇒OKケース
エラーが出ない場合でも「’」「”」は必要
なお、上記でエラーにならない場合でも、意図した結果にならない場合があります。
例えば、以下のような構成があったとします。
xxx@xxx:~/find_sample$ ls -Rl
.:
合計 8
drwxr-xr-x 3 xxx xxx 4096 4月 14 18:06 dir1
drwxr-xr-x 2 xxx xxx 4096 4月 14 18:07 dir2
-rw-r--r-- 1 xxx xxx 0 4月 14 18:05 file0.txt
./dir1:
合計 4
drwxr-xr-x 2 xxx xxx 4096 4月 14 18:07 dir1_1
-rw-r--r-- 1 xxx xxx 0 4月 14 18:06 file1.txt
./dir1/dir1_1:
合計 0
-rw-r--r-- 1 xxx xxx 0 4月 14 18:07 file1_1_1.txt
-rw-r--r-- 1 xxx xxx 0 4月 14 18:07 file1_1_2.txt
./dir2:
合計 0
-rw-r--r-- 1 xxx xxx 0 4月 14 18:07 file2.txt
xxx@xxx:~/find_sample$
上記ファイル構成として、findコマンド(「*」をくくらない)を実行します。
xxx@xxx:~/find_sample$ find ./ -name *.txt
./file0.txt
xxx@xxx:~/find_sample$
「file0.txt」しか検索できていません。
次は、findコマンドで「*」を「’」でくくった場合。
xxx@xxx:~/find_sample$ find ./ -name '*.txt'
./file0.txt
./dir2/file2.txt
./dir1/file1.txt
./dir1/dir1_1/file1_1_1.txt
./dir1/dir1_1/file1_1_2.txt
xxx@xxx:~/find_sample$
くくった場合は、指定ディレクトリ配下もファイルも検索できています。
コマンドプロンプトの「*」は置換されている
コマンドプロンプト上での「*」は文字として扱われないです。
(「*」が置換された文字列が当てはめられる。)
これを確認するには「echo」コマンドを使うと分かり易いです。
xxx@xxx:~/find_sample$ echo *.txt
file0.txt
xxx@xxx:~/find_sample$ cd dir1/dir1_1/
xxx@xxx:~/find_sample/dir1/dir1_1$ echo *.txt
file1_1_1.txt file1_1_2.txt
文字として置換されているので、以下の2つのコマンドは同じ意味になります。
find ./ -name *.txt
find ./ -name file0.txt
まとめ
今回はfindコマンド時の注意事項みたいな旨で記載していますが、別にfindコマンドに限らないので、意識するだけでもハマったりしないで済むかもしれません。
コメント