Linux でファイルとフォルダを検索する
Bash コマンドラインを使用していて、特定の種類のファイル、または特定の名前で始まるフォルダーを特定の場所で検索する必要がある場合はどうしますか?find
コマンドは、幅広い基準に適合する可能性のあるファイルやフォルダーを見つけるのに役立ち、その結果、Linux の強力なコマンドラインユーティリティです。
このチュートリアルでは、Bash シェルコンテキストでの find
コマンドの使用について説明し、基本的な使用法、高度な使用例、および他の Bash シェル機能と組み合わせた使用法について説明します。
Bash での find
コマンドの基本的な使用法
find
コマンドは、プレーンファイルから、正規表現を満たす複数のファイルやフォルダーまで、あらゆるものを検索するために使用される用途の広いツールです。現在のディレクトリでのみ特定のファイルまたはフォルダを検索する最も簡単な使用例は、次のように実行できます。
find filename.ext
find foldername
対応するコマンドを実行した後、ファイルまたはフォルダが存在する場合、それらの名前が出力されます。
find
コマンドは、ディレクトリを検索し、サブディレクトリを入力して、指定されたファイルまたはフォルダを見つけることもできます。現在のディレクトリのフォルダに test
という名前のファイルが多数散在しているとします。
それらがどこにあるかを確認するには、次のように入力します。
find . -name test -type f
コードは、現在のディレクトリとサブディレクトリにある test
という名前のすべてのファイルへのパスを返す必要があります。パラメータ -type f
を使用すると、test
という名前のディレクトリもキャッチされなくなります。プログラマーであれば、これらの多くを使用する必要があります。
-name
パラメーターは一目瞭然ですが、tEST、Test、TeST などの名前をキャッチするために指定された名前を検索するときに大文字と小文字を区別したくない場合は、代わりに -iname
パラメーターを使用できます。i
は insensitive
を意味します。
Bash グロブは、find
コマンドの使用と厳密には関連していません。パターンに存在する文字または文字の数がわからない場合は、パターンに配置されたアスタリスクを使用できます。
たとえば、次のファイルをキャッチしたい場合:test、test2、test_3、testt1、glob を使用して、すべてが test という単語で始まるという事実に基づいてこれらのフレーズをキャプチャできます。
次のコマンドはこれを行います。
find . -name test*
コードは、test という単語で始まるファイルまたはディレクトリ(-type f
パラメータの削除に注意)を返す必要があります。
Bash での find
コマンドの高度な使用
find
コマンドは、さまざまな基準に一致するように拡張できます。複数のグロブまたは名前に基づいてファイルをキャプチャする場合は、-o
または OR 関数の使用を検討することをお勧めします。
たとえば、ディレクトリ内で PDF ファイルと Word DOC / DOCX ファイルの両方を検索する場合は、次の方法で検索できます。
find -iname '*.pdf' -o -iname '*.doc' -o -iname '*.docx'
拡張子が大文字に設定されているファイルをキャッチするための鈍感な名前パラメータは、特定のプログラムの場合に当てはまります。
RegEx に精通している場合は、パターンを使用して、-regex
または -iregex
パラメーターを使用して複数の基準を指定することもできます。
上記と同じ拡張子をキャッチし、さらに test で始まるファイルを探すには、次のパターンを使用できます。
find -regex '.*/test*.\(pdf\|doc\|docx\)' -type f
括弧やパイプ記号などの特殊な正規表現文字にバックスラッシュを使用すると、Bash がそれらを処理できなくなり、文字列全体が直接 find
コマンドに渡されて、正規表現が失敗するのを防ぎます。
最後に、find
コマンドの出力の使用方法に関するいくつかの議論-文字/単語/行のカウントユーティリティである wc
にパイプすることで、一致したファイルとフォルダの出現回数をカウントできます。
find -regex '.*/test*.\(pdf\|doc\|docx\)' -type f | wc -l
データを変数に保存して、スクリプトの後半でコマンドによって解析することができます。
DOCS=$(find -regex '.*/test*.\(pdf\|doc\|docx\)' -type f)
スペース、改行、括弧などの特殊文字がファイルパスに存在する可能性があり、そのような変数をコマンドに渡すときに奇妙な動作が発生する可能性があることに注意してください。このようなデータを処理するときは、それに応じて IFS 区切り文字を設定してください。
find
コマンドは、xargs
操作と同様のアイテムごとのコマンド実行も提供します。これは、-exec
パラメーターを使用して実現できます。
たとえば、一致するすべてのファイルとフォルダーのアクセス許可を取得する場合は、次の手順を実行します。
find -regex '.*/test*.\(pdf\|doc\|docx\)' -type f -exec ls -l {} \;
関連記事 - Bash File
- Bash でファイルから行を削除
- Bash でファイルが空かどうかを確認する
- Bash でファイルに書き込む
- Bash でファイルの名前を変更する
- Bash でファイルを再帰的に検索する
- Bash でファイルを変数に読み込む