<2025.1.4 コメントを受け内容修正>
概要
Macbookでfindコマンドを使ったが、思うような結果を得ることができなかったので調べてみた。
findコマンドとは?
findコマンドはディレクトリ内のファイルやフォルダを検索するためのコマンドです。基本的な使い方は以下のとおりです。
find <探索するディレクトリ> <ファイル名>
以下の構成の場合で考えてみる。
.
├── hoge
│ ├── hoge1.txt
│ ├── hoge2.txt
│ ├── hoge3.txt
│ └── sample.txt
└── fuga
├── fuga1.txt
├── fuga2.txt
├── fuga3.txt
└── fuga4.txt
-nameオプションを使って結果を確認します。-nameオプションはファイル名と探索ディレクトリを指定することで、ファイル名が一致するものを探し出します(とはいえ、ファイル名をいちいち覚えていないので、私はワイルドカードの*と一緒に使っています)。
# 基本的な使い方はfind <探索するディレクトリ> -name <ファイル名>
# 以下は実行したコマンドとその結果
find ./ -name hoge1.txt
# 実行結果 => hoge1.txtが表示される
find ./ -name hoge
# 実行結果 => hogeディレクトリが表示される(配下のファイルは表示されない)
find ./ -name *hoge1.txt
# 実行結果 => no matches found(シェルがワイルドカードを展開しようとするため)
find ./ -name sample.txt
# 実行結果 => sample.txtが表示される
find ./ -name sample*
# 実行結果 => no matches found(シェルがワイルドカードを展開しようとするため)
find ./ -name "sample*"
# 実行結果 => sample.txtが表示される
自分の場合、findコマンドを使う場合は名前の一部だけがわかっているファイルを探すことが多いです。よって、-nameオプションにワイルドカードと組み合わせて探索することがほとんどです。
ここに落とし穴があります!
実は上記の結果は全てMacBookでのもの。Linuxでやるとどうなるかというと…
find ./ -name sample*
# 実行結果 => sample.txtが表示される
find ./ -name "sample*"
# 実行結果 => sample.txtが表示される
そう!ダブルクォートがなくてもしっかり探索して表示してくれるのです!
自分がコマンドを使う場合はLinux(仮想環境)がほとんどで、Macはあまり使わない。そのため、Macでfindコマンドを使った時にダブルクォートを使わず意図した結果が出なかったのです。そのせいでかなり時間を無駄にしました。
なぜこんなことが起きるのか?
Macではデフォルトのシェルがzshであり、ワイルドカードが展開されないため、find ./ -name sampleを実行すると「sample*」という文字列に一致するファイル名を探すことになります。その結果、一致するファイルがなくno matches foundとなります。
一方、bashではワイルドカードが展開され、findコマンドに渡されるため、sample*が「sample」という文字列に続く全ファイルが検索されます。
迷わないための解決策
ワイルドカードを使う時は、ダブルクォートを使うことをお勧めします!私もこれからはダブルクォートを使いますw
最後に
bashとzshでワイルドカードの展開に違いがあり、それによりコマンドの実行結果に差が出てしまいます。こんな違いがあるなんて、驚きですね。