find コマンド メモ

名の通りいろいろ探せる.
ファイルをどこに格納したのか,また全部入っているかという時などなど.

ファイル検索

find . -name "*.f90"

で階層下(.)のファイル名が一致するやつ(上記ならf90形式ファイル)を検出し,リストアップする.
grepとは書く順番が違う.また,デフォルトで再帰的に検索するので grep の-rオプションのようなものは不要.
ファイル名が完全でない場合はワイルドカード「*」が必要.
表示される順番がバラバラのため,sort するのもあり.

find . -name "*.f90" | sort -d

見つかった個数を表示したいときは wc でカウントする.

find . -name "*.f90" | wc -l

階層の深さを指定したい時は maxdepth を使う.

find . -maxdepth 3 -name "*.f90"

さらに,キーワードを複数指定したいときは

find . -type f \( -iname "*.f90" -o -iname "*.F" \)

キーワードを指定しつつ,特定の文字列 '.git' をもつファイル名を除外したいときは

find . ! -path "*.git*" -type f \( -iname "*.f90" -o -iname "*.F" \)



ディレクトリ検索

ディレクトリ名を検出するには,パイプで渡してgrepを使うとできる
一発で済む方法もありそうだが知らない.

find . -type d | grep dirname

奥の階層までディレクトリ検索する必要がない時は,maxdepth オプションを使う.
ワンライナーを書くときに使える.

# -maxdepth 1 はディレクトリの中のディレクトリを検索しない
find . -maxdepth 1 -type d | grep dirname

maxdepth はオプションの位置が重要で,上のような位置で指定しないと正しく動作しないので注意.

検索されたファイルやディレクトリへの一括処理

検出結果全てに対して,cp や rm や ln などのコマンドを実行したいときは,-exec というオプションを使うと便利.
下は hogehoge という名前から始まるディレクトリすべてに file.sh のシンボリックリンクを貼る例.

find . -name "hogehoge*" -type d -exec ln -s ../file.sh {}/file.sh \;

find の -exec オプションは ; と {} が何なのか覚えておくことが大変なので,| で繋いで xargs を使う方がかわりやすくて良いかも.


ライブラリ等のファイルを検索

ライブラリのファイルのありかを知りたいときは, find コマンドより locate コマンドの方が良い.


Front page   Edit Diff Attach Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2021-02-08 (Mon) 10:48:33 (1340d)