名前の一部のみを検索してファイルを検索するコマンド?


32

名前のあるファイルがあるとします:

batman.c
debate.c
cricketbat.c

searchtagを使用してこれらのファイルをすべてリストするには、どのコマンドをどのように使用する必要がありbatますか?


5
現在のディレクトリのみに一致するファイルを一覧表示しますか?現在のディレクトリ以下の任意のディレクトリにありますか?システム上のどこに?
スチールドライバー

回答:


47

batどこでもファイルを見つける

/path/to/folder名前にが含まれるすべてのファイルを検索するにはbat、次を使用できます。

find /path/to/folder -name '*bat*'

私がしている引用された検索パターンを*bat*引用符を省略し、ファイルが一致した場合、ので、*bat*現在のディレクトリに、シェルが拡大する*bat*それらのリストにして渡すことにしますfind。その後、find正しく動作しません。(\*bat\*そして"*bat*"また働く。)

現在のフォルダー(cd編集したフォルダーなど)を検索するに.は、通常どおりを使用します。

find . -name '*bat*'

コンピューター全体を検索するには、を使用します/。ホームディレクトリを検索するには、、~またはホームディレクトリのフルネームを使用します。(シェルは~、ホームディレクトリの完全修飾パスに展開されます。)

名前に基づいて検索を拡大または絞り込む

あなたはファイルを含むので、大文字と小文字を区別せずに検索する場合はBATbAt一致しているなど、及び、使用-inameの代わりに、テスト-nameのテストを:

find /path/to/folder -iname '*bat*'

すべてのファイルがで終わることに気付きました.c。そのようなファイルのみを検索する場合は、次を使用します。

find /path/to/folder -name '*bat*.c'

すべてのファイル名が接尾辞のbat前の部分の先頭または末尾にあることに気付きました.c。のようなファイルの一致を避けたい場合はembattled.c、次を使用できます。

find /path/to/folder -name '*bat.c' -o -name 'bat*.c'

-oであるか、オペレータが。

ファイルのみの一致

フォルダー、シンボリックリンク、および特殊なデバイスノードではなく、通常のファイルのみを検索するには、を使用できます-type f。これは頻繁に推奨され、時には非常に適切な場合もありますが、多くの場合、特に出力を自分で調べる目的で実行している場合は、本当に必要なものではありませんfind。検索に一致するシンボリックリンクある場合、それについて知りませんか?

通常のファイルとシンボリックリンクの両方を検索する場合は、次を使用できます。

find /path/to/folder -name '*bat*' \( -type f -o -type l \)

これは、-o演算子とグループ化のための括弧も使用します(シェルがそれらを特別に処理しないように引用符で囲む必要があります。そうしないと、構文エラーが発生します)。

しかし、最終的に通常のファイルを指すシンボリックリンクのみを表示したいとします(ディレクトリ、デバイスノードなどへのシンボリックリンクは表示しない)。それは実際にはさらに簡単です:の-xtype代わりに使用します-type。フラグを使用して実行findしていない場合、シンボリックリンクで、リンクが指すファイルの種類をテストします。-L-xtype

find /path/to/folder -name '*bat*' -xtype f

ファイルへの別のシンボリックリンクへのシンボリックリンクがある-xtype f場合、その直接のターゲットが通常のファイルではなく別のシンボリックリンクであっても、それと一致します。これはほとんど常にあなたが望むものです。

多くの場合、人々は自分が欲しいと思う-type fが、本当に欲しい-xtype f

詳細な出力を取得する

findを指定しない場合のデフォルトのアクションは-printです。上記のすべてのコマンドは、次のコマンドと同等です。-print最後に追加されです。

find多くの場合、見つかったファイル(多くの場合、変更を行うコマンド)に基づいてコマンドを実行するために使用されます。ただし、結果を表示することを目的とする他​​のアクションもあります-print。特に興味深いのは-ls

find /path/to/folder -name '*bat*' -ls

これにより、各ファイルの詳細情報が、複数列形式で表示されます。これは、を実行することで表示される内容と似ています(まったく同じではありません)。ls file

参考文献

詳細についてはfindファイルを検索する方法およびその他、以下を参照してください。


1
すばらしい答え、特に-xtypeアドバイス。おそらくls *bat*および-maxdepth/ mindepthも言及する価値があります。
mklement0

2
@ mklement0ありがとう!OPは、ファイルの場所と、再帰が必要かどうかについての明確化をまだ提供していません。混乱の答えがカバーされls、すでに、私は再帰的なケースに焦点を当てfind、ここ。もちろん、あるパターン(lsおよびfindwith -maxdepth)に一致するファイル名の非(またはそれ以下)再帰的なリストをカバーする詳細な回答も役立ちます。あなたはそのような答えを投稿したいと思うかもしれません!
エリアケイガン

16

最も簡単な方法は、実行することです

locate bat

このようにして、ファイル名に「bat」を含むファイルをコンピューター全体で検索できます

PC上のファイルのリストを更新するには

updatedb

アカウントに最近新しいファイルを追加したときにこのコマンドを実行します


1
ニーズupdatetdb
Sergiy Kolodyazhnyy

4
@Serg新しいファイル(updatedb最後に手動または自動で最後に実行されたものより新しいファイル)を見つけるには、sudo updatedb最初に実行する必要があります(はい)。
エリアケイガン

これにより、システム全体で一致する名前が検索されることに注意してくださいbat
テルドン

1
@terdon私はすでに答えでこれを述べました、私がすでにこれを述べたとき、それが下票に値するとは思わないでください。
マークカービー

1
これはA LOTよりも速いことに注意してくださいfind /としてlocateながら、データベースから検索しfind、再帰的にリストし/た後とは、正規表現にマッチします。
ティモシー区

14

ターミナルを開き、ディレクトリを検索を開始するディレクトリに変更してから、次のコマンドを実行します。

find . -name "*bat*" -type f 

.現在のディレクトリからfindコマンドを開始します。文字列に一致すると、大文字と小文字が区別されます。(ケース・小文字を区別しないで)ファイルだけを検索。
-namebat-iname
-type f


削除して元に戻す?ok +1:P;)
AB

6

ファイルが現在のディレクトリにある場合:

$ ls *bat*
batgirl.c  batman.c  batwoman.c  cricketbat.c

または(1行ずつ表示するには):

$ ls -1 *bat*
batgirl.c
batman.c
batwoman.c
cricketbat.c

そのファイルをシステムで検索する場合は、次を使用します。

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c

1
あなたの検索がルートディレクトリで起動している場合は、このコマンドでは、一部のフォルダのための許可が拒否された「報告しますと、sudoを追加したい場合があります
Sergiy Kolodyazhnyyを

4

findコマンドを使用し、-iname大文字と小文字を区別しないファイル名の一致-nameオプション、または大文字と小文字を区別するファイル名の一致オプションを使用します。どちらもワイルドカード名を使用できます。したがって、「bat」を含むファイル名を見つけるには、次を使用します。

find / -iname '*bat*'

または

find / -name '*bat*'

これ*は「任意の文字」を意味するため、検索は、そのbat前後の任意の文字(なしを含む)で検索します。/ルートディレクトリから検索が再帰的に、あなたが使用することができ.、現在のディレクトリ、またはあなたから検索したい場所を絶対パスから再帰的に検索しますました。Linuxシェルスクリプトで正規表現を使用してファイルを検索する方法を見てください


@EliahKaganありがとう、回答にさらに情報を追加しました。
-AJefferiss

+1編集していただきありがとうございます。IMOいることを、この答えの強さ回避の無差別使用推奨する-type fより簡単にディレクトリを除くより行い、ある、ユーザーが本当に欲しいものが多いではないが
エリアケイガン

2

古き良きを使用しfindます。

find <path_for_search> -type f -iname "*bat*" 

例えば。:

% find . -type f -iname "*bat*" 
./batgirl.c
./batwoman.c
./cricketbat.c
./batman.c

からman find

-type c
          File is of type c:
          [..]
          d      directory
          [..]
          f      regular file
          [..]

-iname pattern 
          Like -name, but the match is case insensitive.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.