findコマンドは、Linuxコマンドラインでファイルとディレクトリを検索するために使用されます。
検索は、最も強力で頻繁に使用されるコマンドの1つです。また、50を超えるオプションを備えた最も広範なコマンドの1つであり、特にexecまたはxargsコマンドと組み合わせると、少し混乱します。
システム管理者またはソフトウェア開発者がコマンドラインで作業しているときにfindコマンドを回避することは不可能です。それを恐れる代わりに、あなたはその力を受け入れるべきです。
使用する可能性のあるfindコマンドの最も一般的な例のいくつかについて説明します。ただし、その前に、その構文と使用方法を示します。
Linuxでコマンドを検索
findコマンドの一般的な構文は次のとおりです。
find [directory to search] [options] [expression]
括弧[]内のすべてはオプションです。これは、find
を実行できることを意味します オプションと引数のないコマンド。現在の場所にあるすべてのファイルとディレクトリをダンプするだけです。それはあまり役に立ちませんよね?
もっと詳しく見てみましょう:
directory to search
基本的には、検索を開始する場所です。デフォルトでは、検索は再帰的に行われ、現在の場所から開始されます。options
検索の種類を、名前、種類、変更時刻などで指定します。ここでは50を超えるオプションが可能です。expression
検索語を指定できます。名前でファイルを検索する場合、expressionはファイル名です。パターンに一致する名前のファイルを検索する場合は、パターン内の式。
簡単な例を見てみましょう:
find . -type f -name myfile
このコマンドは、現在のディレクトリとそのサブディレクトリで検索を実行して、myfile
という名前のファイル(ディレクトリではない)を見つけます。 。オプション-type f
ファイルのみを検索するように要求します。単一のドット.
現在のディレクトリを意味します。
findコマンドの実際的な例をいくつか見てみましょう。
名前でファイルとディレクトリを検索できます:
find . -name SEARCH_NAME
記載されているファイルタイプがないため、指定された名前のファイルとディレクトリの両方を検索します。
次の例では、mystuffという名前のファイルとディレクトリの両方を検索します。
[email protected]:~/Examples$ find -name mystuff
./new/mystuff
./mystuff
ファイルのみを検索する場合は、ファイルタイプ-f:
を指定します。find . -type f -name SEARCH_NAME
タイプと名前の順序は重要ではありません。前の例を見て、ファイルのみを検索します:
[email protected]:~/Examples$ find -type f -name mystuff
./mystuff
ディレクトリのみを検索する場合は、タイプ-d:
を指定します。find . -type d -name SEARCH_NAME
前のファイルで、ディレクトリのみを検索します:
[email protected]:~/Examples$ find -type d -name mystuff
./new/mystuff
デフォルトでは、findコマンドでは大文字と小文字が区別されます。 -iname
を使用すると、指定された名前で大文字と小文字を区別しない検索を実行できます。 -name
の代わりに 。
find . -type f -iname SEARCH_NAME
type d
で使用できます 同様に。
[email protected]:~/Examples$ find -iname mystuff
./new/mystuff
./MyStuff
./mystuff
上記の3つの例のスクリーンショット:
拡張子でファイルを検索(重要)
findコマンドの最も一般的な使用法の1つは、特定のタイプのファイルを検索することです。特定の拡張子を言う必要があります。
たとえば、現在のディレクトリ内のすべてのC++ファイルを検索するとします。 C ++ファイルは拡張子.cppで終わるため、次のように検索できます。
find . -type f -name "*.cpp"
このようにして、findコマンドにtype file
を探すように指示します。 .cpp
で終わる名前 。
[email protected]:~$ find . -type f -name "*.cpp"
./file.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream2/zstream_test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/zfstream.cpp
findコマンドを使用するときは、検索式を常に二重引用符で囲んでください。 検索語を二重引用符または一重引用符で囲むことをお勧めするのはなぜですか?そうしないと、シェルがワイルドカードを展開するためです。
検索語を引用符で囲まない場合:
find . -type f -name *.cpp
シェルは*.cppを展開し、名前が.cppで終わる現在のディレクトリ内のすべてのファイルに置き換えます。
これは、ファイルが1つしかない場合は機能する可能性がありますが、複数ある場合は、シェルが誤った構文を要求します。
上記の例では、cppファイルは1つしかないため、コマンドをfind . -type f -name file.cpp
、file.cpp
なので機能します 引き続き検索語として機能します。
ただし、同じディレクトリに2つの.txtファイルがあるため、コマンドをfind . -type f -name another.txt new.txt
、現在複数の検索語があるため、文句を言います。
これが、検索語を常に二重引用符で囲む必要がある理由です。
複数の拡張子(または条件)を持つ複数のファイルを検索します
上記のコマンドは、特定の拡張子を持つファイルを検索しました。拡張子が異なるファイルを探したい場合はどうしますか?
findコマンドを複数回実行する代わりに、-o
を使用して1回実行します。 論理OR条件として機能するオプション:
find . -type f -name "*.cpp" -o -name "*.txt"
次に例を示します:
[email protected]:~/Examples$ find . -type f -name "*.txt" -o -name "*.cpp"
./new.txt
./file.cpp
./new/new.txt
./new/dir2/another.txt
./new/dir1/new.txt
./another.txt
これまでのところ、を指定したため、すべての例で現在のディレクトリで検索が実行されました。例では。
ドットはディレクトリの絶対パスまたは相対パスに置き換えることができるため、現在の場所を離れることなく、指定したディレクトリ内のファイルを検索できます。
[email protected]:~/Examples$ find ./new -name mystuff
./new/mystuff
目的のファイルが複数の場所にあると思われる場合は、findコマンドを複数回実行する必要はありません。検索するすべてのディレクトリパスをfindコマンドで指定するだけです:
find ./location1 /second/location -type f -name "pattern"
-empty
オプションを使用すると、findコマンドを使用して空のファイルとディレクトリを検索できます。
現在のディレクトリ内のすべての空のファイルとディレクトリを見つけるには、次を使用します。
find . -empty
空のファイルまたはディレクトリのみを検索するようにファイルタイプを指定できます。
find . -empty -type f
ファイル名検索と組み合わせることもできます:
find . -empty -type f -name "*.cpp"
大きなファイルまたは小さなファイルを検索(ファイルサイズに基づいて検索)
sizeパラメータで実行された検索に基づいて、大きなファイルまたは小さなファイルを見つけることができます。これはファイルでのみ機能し、ディレクトリでは機能しません。
-size
を使用します サイズがNより大きい場合は+N、サイズがNより小さい場合は-Nのオプション。
サイズが正確に50KBのファイルを検索します:
find . -size 50k
現在のディレクトリで1GBを超えるファイルを検索するには:
find . -size +1G
20バイト未満を見つけるには:
find . -size -20c
サイズが100MBより大きく2GBより小さいファイルを検索するには:
find . -size +100M -size -2G
サイズ検索と名前検索を組み合わせることもできます。たとえば、名前が.logで終わり、サイズがルートディレクトリで500 MBを超えるすべてのファイルを検索するには、次のコマンドを使用できます。
find / -size +500M -name "*.log"
思い出すには:
-
c
:バイト -
k
:キロバイト -
M
:メガバイト -
G
:ギガバイト
最近変更されたファイルを検索します(変更または作成時間に基づいて検索します)
mtime、atime、ctimeの概念をご存知ですか?
- mtime:ファイルの最終変更時刻
- ctime:ファイルの作成時間
- atime:ファイルの最終アクセス時刻
最近変更されたすべてのファイルを検索したい状況に陥ることがよくあります。変更された時間による検索は、そのような場合に役立ちます。
3日(3 * 24H)以内に変更されたすべてのファイルを検索するには、次を使用します。
find . -type f -mtime -3
少なくとも5日前(5 * 24H)に作成されたすべてのファイルを検索するには、次を使用します。
find . -type f -ctime +5
私は24時間が巨大な時間枠であることを知っています。ほんの数分前に変更されたファイルを検索したい場合はどうなりますか?そのためには、mmin
を使用できます 、amin
およびcmin
。
過去5分間に変更されたすべてのファイルを検索するには、次を使用します。
find . -type f -mmin -5
検索名とともに上限と下限を指定できます。以下のコマンドは、過去20〜30分間に変更されたすべての.javaファイルを検索します。
find . -type f -mmin +20 -mmin -30 -name "*.java"
Linuxでのファイルパーミッションの概念に精通していることを願っています。
findコマンドを使用すると、特定のファイル権限とアクセスモードを持つファイルを検索できます。
find -perm mode
たとえば、現在のディレクトリでアクセスモード777のすべてのファイルを検索するには;
find . -perm 777
すべての読み取りと書き込みにアクセスできるすべてのファイルを検索するには(完全に一致します。ファイルにすべての実行権限がある場合は一致しません):
find . -perm a=r+w
所有権に基づいてファイルを検索することもできます。
たとえば、現在のディレクトリでユーザーJohnが所有するファイルを検索するには、次を使用します。
find . -type f -user John
サイズ、時間、名前などの他のオプションと組み合わせることもできます:
find . -type f -user John -name "*.cpp"
再帰的に検索しないで、現在のディレクトリでのみ検索してください
デフォルトでは、findコマンドは現在の場所のすべてのサブディレクトリを検索します。これを望まない場合は、検索の深さを1に指定できます。これにより、検索が現在のディレクトリのみに制限され、サブディレクトリは除外されます。
find . -maxdepth 1 -type f -name "*.txt"
検索からディレクトリを除外する場合は、パス、整理、論理和を組み合わせて行うことができます。
find . -path "./directory_exclude/*" -prune -o -name SEARCH_NAME
ディレクトリのパスにある*に注意してください。-prune
パスと-o
の後 剪定後。
基本的に、pruneコマンドは、pathで指定された値を使用しないように要求します。 Pruneは常に-o
とともに使用されます 用語の右側が、プルーニングされていないディレクトリに対してのみ評価されるようにするため。
検索コマンド(execおよびxargs)の結果に対してアクションを実行します
これまで、さまざまな基準に基づいてファイルを見つけるさまざまな方法を学びました。それは良い。ただし、findコマンドの結果に対して特定のアクションを実行することで改善できます。
たとえば、特定の名前パターンに一致するファイルを見つけて一度に名前を変更したり、空のファイルを見つけて削除したりするのはどうですか?
パイプリダイレクトを使用して、あるコマンドの出力を別のコマンドの入力と組み合わせることができることをご存知でしょう。ただし、これは、少なくとも直接ではなく、findコマンドの出力では機能しません。
検索コマンドの結果に対してアクションを実行する場合は、次の2つのオプションがあります。
- execを使用する
- xargsを使用する
findとexecの使用
findコマンドを使用して検索ファイルをロングリスト(ls -l)したいとします。使用するものは次のとおりです:
find . -type f -name "*.txt" -exec ls -l {} +
出力は次のとおりです:
[email protected]:~/Examples$ find . -type f -name "*.txt" -exec ls -l {} +
-rw-rw-r-- 1 abhishek abhishek 39 Oct 13 19:30 ./another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir1/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir2/another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:51 ./new/mystuff/new.txt
-rwxrwxrwx 1 abhishek abhishek 35 Oct 13 15:37 ./new/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:16 ./new.txt
多くの人が{} +
を追加するのを忘れています execコマンドの最後。これを使用し、{}と+の間のスペースに注意する必要があります。
{}は、findコマンドの結果を参照するものです。 {ファイル1、ファイル2、ファイル3}のように想像できます。 +
signは、execコマンドを終了するために使用されます。
execには別の規則もあります:
find . -type f -name *.txt" -exec ls -l {} \;
ここ、; +記号の代わりに使用されます。追加の\前;特殊文字をエスケープするために使用されます;。
{} +
の利点 ls -l file1 file2 file3
のように実行するコマンドが少ないということです 一方、{} \;
ls -l file1
を実行します 、ls -l file2
など
ただし、{} \;
{}
を使用できるという利点があります 同じexecステートメントで複数回。たとえば、次のコマンドは、見つかったすべてのファイルの名前を.old拡張子に変更します。
find . -type f -name *.txt" -exec mv {} {}.old \;
xargsの使用
多くのLinuxユーザーは、パイプのリダイレクトに慣れています。末尾に{} +
が付いたこのexecコマンド 彼らを怖がらせるようです。
これはxargsが役立つところです。 findコマンドの出力をパイプ経由でxargsコマンドに解析するだけです。
find . -type f -name *.txt" | xargs ls -l
構文はもっと単純に見えますよね? Xargsコマンドも非常に強力です。ここでそれについて読むことができます。
findとgrepの組み合わせ
findとxargsおよびexecコマンドの組み合わせについて理解したので、これを使用してfindとgrepを組み合わせることができます。
システム管理者やソフトウェア開発者にとって、findとgrepは、最も一般的でありながら最も有用な組み合わせの1つです。
findを使用してファイル名パターンを検索し、grepを使用してそれらのファイル内のコンテンツを検索します。
たとえば、Aliceという用語を含むすべての.txtファイルを検索するとします。次のようにfindとgrepを組み合わせます:
find . -type f -name "*.txt" -exec grep -i alice {} +
xargsでも同じことができます:
find . -type f -name "*.txt" | xargs grep -i alice
もちろん、これは最も単純な例ですが、grepコマンドに精通している場合は、好みや必要に応じて使用できます。
また、すべてのfindコマンドオプションと例を一覧表示することはできません。可能性は無限大ですが、findコマンドに慣れると、さまざまな状況で使用を開始できます。ここでロジックを組み合わせる方法は、実際にはあなた次第です。
これらのfindコマンドの例がお役に立てば幸いです。この記事を改善するための質問や提案がまだある場合は、コメントセクションでお知らせください。