†Linuxなんて大キライ†

find:ファイルの検索

作成開始日 2022.10.24
最終更新日 2022.10.25

【目的】DOSの「DIR a*.jpg /S」相当の命令を実行する

【結論】find -name a*.jpg

やりたい事はごく単純で、サブディレクトリ以下を含めた範囲で、ワイルドカードを使ってファイル検索をしたい、ただそれだけなんだが…これがLinuxではなかなか厄介。普通に考えて(DOSのDIRの書式から類推して);

ls -適当なオプション a*.jpg
みたいなカンジで何とかなりそうな気もするのだが、少なくとも私には正解が見つけられなかった。比較的近いのは;
ls */a*.jpg	←1階層下のサブディレクトリを検索
という形式だが、これでは1階層下限定にしかならない。「ls */*/...*/a*.jpg」の要領で階層数を増やすことはできるが、それも、指定した階層に限定にされてしまう。カレント以下の全てのサブディレクトリを含む指定方法が判らない。

で、まあ、そういう時は「find」を使えばいいんだが、そもそも何で「ls」(ファイル一覧)と「find」(ファイル検索)なんて言う似たような命令が2つもあるんだ?DOSにも「FIND」はあるが、あればファイル内テキストの検索で「DIR」とは全然用途が違う。

【構文】find 検索開始位置 -name 検索ファイル名
【用例】@find /usr -name *.txt	「/usr」以下のディレクトリを検索
    Afind -name *.txt	省略時はカレント以下のディレクトリを検索
ともあれ「find」を使えば所期の目的は達成されるのではあるが、これも何だかイマイチピンとこない。その理由の一つが「-name」オプション指定の不自然さ。実は、「-name」なしでも、「find」命令は実行できる。
find a*.jpg	←カレント・ディレクトリ限定
ところが、これだと、サブディレクトリが検索されない。検索範囲がカレントに限定されてしまう。結果だけ見れば、まるで「-name」がサブディレクトリ検索指定のように機能している。無論、そんなワケはないのだが…

また、findは検索開始位置を明示的に指定することもできる。たとえば、「/usr」以下のディレクトリを検索したければ以下のようになる。

find /usr -name a*.jpg
で、これに凄い異和感を感じたのは、この書式で「-name」を省略すると、期待したような結果にならないと言う点。ファイル名指定が無視されて、すべてのファイルが表示されてしまう。これはワイルドカードの有無に拘らず同じ結果になる(ワイルドカード使用時は-name必須とか言うハナシとは別物)。
find /usr a*.jpg	←ファイル検索が機能しない
そもそも、第1引数が検索開始ディレクトリか、検索ファイル名かをどうやって判別するんだ?「-name」のようなオプションが指定してあれば明白だが、無指定でディレクトリとファイルを判別するのは難しいんじゃないか?書式では判別不能なので、該当エントリがいずれであるかを調べてから構文解釈するとか…?いや、それも…。なお、検索開始ディレクトリを複数指定する事もできるようなので、2つ並べてあったら最初がディレクトリ名で、次がファイル名というような順序による判別はしていないはず。
find 画像 ダウンロード	←両方ともディレクトリ
…このあたりよく判らんのだが、オプション指定(-)なしの引数は、全てディレクトリ(検索開始位置)と判断されるのではないだろうか?「find a*.jpg」の例は、「-name」オプションなしでも検索ファイル名を指定できることを意味しているのではなく、検索開始位置として「a*.jpg」を指定した結果が、たまたまカレントにおける検索結果と一致したに過ぎないのではないか?

通常、ディレクトリを指定すべき場所にファイルが指定されれば、不適切な引数としてエラーになると思うのだが、findではなそうではなく、ファイルを「中身のないディレクトリ」と見なして、ディレクトリ名(ファイル名)のみを表示している、と解釈すれば筋は通る。まあ、Linuxのノードに関してはほとんど理解していないので、なんでこんな仕様になるのか、必然性みたいなものは全然ピンとこないのだが…


【Linuxなんて大キライ目次】 【ホーム】