Linuxでコマンドラインを使ってファイルを探す方法

find は、ファイルシステム内のオブジェクトを簡単な条件メカニズムに基づいて再帰的にフィルタリングするためのコマンドです。 ファイルシステム上のファイルやディレクトリを検索するには find を使用する。 -exec フラグを使用すると、同じコマンドでファイルを検索し、すぐに処理することができる。

Find Linux Files by Name or Extension

名前や拡張子によって特定のファイルの場所を見つけるのにコマンドラインから find を使用します。 次の例は、/home/username/ ディレクトリとすべてのサブディレクトリにある *.err ファイルを検索します:

find /home/username/ -name "*.err"

コンソールに同様の出力が表示されます:

 /home/username/example.errThe matching file in the /home/username/ directory is "example.err"

Common Linux Find Commands and Syntax

通常 find コマンドは次の形式を取ります:

find options starting/path expression
  • options属性によりfind プロセスの動作および最適化方法を制御することが可能です。
  • starting/path 属性は、find がフィルタリングを開始するトップレベルのディレクトリを定義します。
  • expression 属性は、出力を生成するためにディレクトリ階層を検索するテストを制御します。 パスを省略すると、ディスク全体からファイルを検索します。 例えば、/home/username ディレクトリにある example.err という名前のファイルを次のコマンドで見つけることができます:
    find -name example.err

    同様の出力が得られるでしょう:

     ./username/example.err

    検索コマンドを使用して現在のディレクトリ内のファイルを見つける

    例のディレクトリ構造とファイルを見てみましょう。 これらは、このガイドの例を通して参照されます。

     ├── directory_1│ ├── subdirectory_1│ │ └── example.err│ └── example.err├── directory_2│ └── example.err├── directory_3│ └── example.err├── image01.png├── web_files│ ├── app.html│ ├── cb=gapi.loaded_0│ ├── edit.html│ ├── m=_b,_tp│ ├── rs=AA2YrTtgyE1yYXiu-GuLS6sbJdYr0u8VBQ│ ├── rs=AA2YrTvod91nzEJFOvvfJUrn6_vLwwY0bw│ ├── saved_resource.html│ ├── single.html│ └── unnamed.jpg├── web.html└── example.err

    directory_1 にいて、ディレクトリまたはそのサブディレクトリの中からファイル example.err を見つけたい場合、次のコマンドを発行できます:

    find . -name example.err

    出力は次のようになります:

     ./example.err./directory_1/example.err

    出力は directory_1 ディレクトリ構造を反映したものになっています。

     ├── directory_1│ ├── subdirectory_1│ │ └── example.err│ └── example.err

    Find Image Files in Linux Using the Command Line

    前のセクションのファイル構造を参照すると、ディレクトリ構造のルート (/) に位置する image01.png という名前のイメージが存在することがわかります。

    ファイル image01.png を見つけるために、/ ディレクトリ内に格納されているすべての .png ファイルを検索する次の find コマンドを実行します:

    find -name *.png

    同様の出力が表示されます:

     ./image01.png

    イメージファイルのタイプを変更し、ルートディレクトリ (/) 内の .jpg ファイルを探してください:

    find -name *.jpg

    この例のように出力します。

     ./web_files/unnamed.jpg

    コマンドラインを使用してディレクトリ内の空のファイルを検索する

    コマンドラインを使用してディレクトリ内の空のファイルを検索するには、次のコマンドを実行します:

    find . -type f -empty

    何も出力されない場合は、現在のディレクトリ内に空のファイルは存在しません。

    Options and Optimizations for Finding Files in Linux Using the Command Line

    find のデフォルト設定では、シンボリックリンクは無視されます。 もし find がシンボリックリンクを追跡して返すようにしたい場合は、以下のようにコマンドに -L オプションを追加する:

    find -O3 -L /var/www/ -name "*.html"

    このコマンドは最大最適化レベル (-O3) と find がシンボリックリンク (-L) を追跡できるようにするものである。 find/var/www/ の下のディレクトリツリー全体から .html で終わるファイルを検索する。

    find はフィルタリング戦略を最適化し、パフォーマンスを向上させる。 最適化のレベルは、-O1, -O2, -O3 の 3種類から選択できる。 -O1 最適化はデフォルトで、他のすべてのテストを実行する前に find にファイル名に基づくフィルタリングを強制します。

    -O2 レベルでの最適化は、-O1 と同様にファイル名フィルタを優先し、他のよりリソース集約型の条件に進む前にすべてのファイルタイプのフィルタリングを実行します。 レベル -O3 の最適化では、find が最も厳しい最適化を実行し、相対的な費用と成功の可能性に基づいてすべてのテストを並べ替えます。

    ディレクトリを検索する。

    コマンド 説明
    -O1 Filter based on filename first (default){ ファイル名のフィルター。
    -O2 最初にファイル名、次にファイル タイプ。
    -O3 リソースと可能性を効率的に使用に基づいて、find で自動的に検索結果を再注文できるようにします。 成功
    -maxdepth X 現在のディレクトリと X レベル深いすべてのサブディレクトリを検索します。
    -iname テキストケースに関係なく検索します。
    -not テストケースと一致しない結果のみを返します。
    -type f ファイルを検索する。
    -type d

    コマンドラインを使ってLinuxでファイルを修正時刻で検索

    find コマンドではファイルが最後に修正された時間に基づいてディレクトリ階層をフィルターすることができます。 たとえば、次のコマンドは、過去 7 日間に変更された .err 拡張子を持つすべてのファイルを検索します:

    find / -name "*err" -mtime -7

    この例のコマンドは次の出力を返します:

     /home/username/directory_3/example.err/home/username/username/example.err/home/username/username/directory_2/example.err/home/username/username/directory_1/example.err/home/username/username/directory_1/subdirectory_1/example.err

    Use Grep to Find Files in Linux Using the Command Line

    find コマンドは、ファイルの名前とメタデータに基づいてディレクトリ階層をフィルターすることだけが可能です。 ファイルの内容に基づいて検索する必要がある場合は、grep のようなツールを使用します。 次の例を考えてみましょう:

    find . -type f -exec grep "test" '{}' \; -print

    このコマンドは、現在のディレクトリ階層 (.) にあるファイル (-type f) であるすべてのオブジェクトを検索し、条件を満たすすべてのファイルに対してコマンド grep "test" を実行します。 一致したファイルは画面に表示される(-print)。 中括弧({})は、検索結果のプレースホルダーである。 {}はシングルクォートで囲まれ、grepに不正なファイル名を渡さないようにしている(')。 -exec コマンドはセミコロン (;) で終了するが、シェルによる解釈を避けるためにエスケープ (\;) されるべきである。

    例で使用されているファイル (example.err) には “test” というテキストが含まれている。

     test./directory_3/example.errtest./example.errtest./directory_2/example.errtest./directory_1/example.errtest./directory_1/subdirectory_1/example.err

    Grep は、現在の作業ディレクトリ内で文字列 “test” を含むすべてのファイルを識別しました。

    Note

    findコマンドが-execオプションを実装する以前は、xargsコマンドを使用して上記の例と同様の出力を生成できました:

    find . -type f -print | xargs grep "test"

    Process and Find Files Using the Find Command in Linux

    -execオプションはfind式に一致するすべてのオブジェクトに対してコマンドを実行します。 次の例を見てみましょう:

    find . -name "example.err" -exec chmod o+r '{}' \;

    これは、現在の階層 (.) にあるすべてのオブジェクトに対して rc.conf というファイルを検索し、find コマンドの結果のファイルのパーミッションを変更するために chmod o+r コマンドを実行するものです。 一致するものが存在するディレクトリで指定されたコマンドを実行するには、-execdirを使用します。

    -exec または -execdir オプションは、追加のプロンプトなしに実行されます。

    How to Find and Delete Files Using the Linux Command Line

    Caution

    Use this option with extreme caution.

    Add the option -delete to delete all files that match expression to match match the end.

    以下の例では、find は現在のディレクトリから始まる階層内のすべてのファイルを再帰的に探し、拡張子が .err で終わるすべてのファイルを削除します:

    find . -name "*.err" -delete

    まだ質問がある場合は、

    コミュニティに参加して、他の Linode と Linux ファンのためにあなたの質問を投稿してください:

    関連質問。

コメントを残す

メールアドレスが公開されることはありません。