ワイルドカードマッチングに基づいて、現在のフォルダーとサブフォルダー内のすべてのファイルを再帰的に検索するにはどうすればよいですか?


1888

ワイルドカードマッチングに基づいて、現在のフォルダーとサブフォルダー内のすべてのファイルを再帰的に検索するにはどうすればよいですか?

回答:


2742

そのためにfindを使用します

find . -name "foo*"

find開始点が必要で、.(ドット)は現在のディレクトリを指します。


21
私はこれがlinuxとしてタグ付けされていることを知っていますが、これは言及する価値があります。Linux以外の* nixバリアントではパスが必要です。Linuxでは、ドットを使用する場合、パスはオプションです。
IslandCow 2013年

4
@Seatter "foo *"は、 "foo"で始まるすべてのファイルを探すようにfindに指示します。それは彼の例にすぎません。「gpio *」を使用して、名前がgpioで始まるすべてのファイルを検索するか、単に「gpio1」を使用して、gpio1という名前のすべてのファイルを検索できます。
schumacher574 2014

29
「foo *」は引用符で囲まれているので、シェルは検索に渡す前にそれを展開しません。あなたがちょうどした場合find . foo*、それfoo*は展開され、その後、検索に渡されます。
グリンチ

33
" "再帰的な検索に非常に必要な強調する価値があります。
WesternGun、2016年

3
また便利:権限のないディレクトリ(またはその他のエラー)について通知を受けたくない場合は、次のようにしてくださいfind . -name "foo*" 2>/dev/null
Jobbo

221

多くの場合、findをgrepにパイプする方が便利です。これにより、任意のワイルドカードマッチングのための正規表現を最大限に活用できます。

たとえば、ファイル名に大文字と小文字を区別しない文字列「foo」を含むすべてのファイルを検索するには、次のように入力します。

~$ find . -print | grep -i foo

57
findまた有し-iname-regexおよび-iregexそうするために、大文字小文字を区別しないワイルドカード、正規表現、および大文字と小文字を区別しない正規表現マッチングのためのフラグを配管することはgrep不要です。
iobender 2015

7
不要というよりは便利だと思います。
Elijah Lynn

1
ただし、grep -vにパイプすると、単純な文字列または正規表現を使用して、不要なエントリを削除できます。
door_number_three 2017

3
@iobender-悲しいことに、すべてのシステムにfindこれらのオプションをサポートするコマンドが付属しているわけではないことを経験から知ることができます。時にはgrep唯一のオプションになります。
Llama氏、

150

find パターンに一致するすべてのファイルを検索します。

find . -name "*foo"

ただし、画像が必要な場合:

tree -P "*foo"

お役に立てれば!


18
brew install treeapt-getインストールされていないMac OSXユーザー向け
DeBraid '20

1
macOS Sierraでテストされました。「-print」-> 'findを追加するだけです。name "* foo" --print '。superuser.com/questions/177289/searching-mac-through-terminal
john-salib 2017

2
sudo yum install tr​​ee -y for CentOS
Santosh Kumar Arjunan

39
find -L . -name "foo*"

いくつかのケースでは、シンボリックディレクトリリンクを処理するために-Lパラメータが必要でした。デフォルトでは、シンボリックリンクは無視されます。これらの場合、ディレクトリをサブディレクトリに変更して、パターンに一致するファイルを表示しても、findがファイル名を返さないため、非常に混乱しました。-Lを使用すると、この問題が解決します。findのシンボリックリンクオプションは-P -L -Hです。


1
Lスイッチは非常に役立ちます。多くの場合、ソフトリンクされているか通常のディレクトリであるかにかかわらず、ユーザーは基礎となるディレクトリについて何も知りません。したがって、疑問がある場合は、常にLオプションを使用することをお勧めします。少なくとも、それはいつも私を助けてきました。
Ritesh

2
それが私の答えでした。ありがとう!
iedmrc

33

シェルが新しいグロビングオプションをサポートしている場合(以下によって有効にするshopt -s globstarことができます)、以下を使用できます。

echo **/*foo*

ファイルまたはフォルダを再帰的に検索する。これは、Bash 4、zsh、および類似のシェルでサポートされています。


個人的に私はこのシェル関数を定義しています:

f() { find . -name "*$1*"; }

注:上記の行は、シェルに直接貼り付けるか、ユーザーの~/.bashrcファイルに追加できます。

次に、次のように入力してファイルを検索できます。

f some_name

または、単純な構文のfdユーティリティを使用することもできますfd pattern


1
これは単一のレベルに入るだけです。私のサブディレクトリに
再帰

3
@Broncha shopt -s globstarコマンドで拡張グロビングをアクティブにする必要があるため。これは、Bash、zsh、および類似のシェルでサポートされています。
ケノーブ2017年

bash-3.2$ shopt -s globstar与えbash: shopt: globstar: invalid shell option name
drewish

@drewish Bashを4.xにアップグレードする必要があります
kenorb

echo * / * fooはfindよりも高速ではありません
Josef Klimuk '06

32

fd

findが遅すぎる場合は、fdutilityを試してくださいfind。Rustで書かれたシンプルで高速な代替手段です。

構文:

fd PATTERN

デモ:

ホームページ:https : //github.com/sharkdp/fd


17
初めて9年ほど前にSOでgifを見たことがあります。良くやった!
Joshua Pinter

1
これらのパフォーマンス結果は非常に有望に見えます。あなたは
自作に

トピック外:デモ用のsvgファイルを作成するためにどのツールを使用しましたか?
アプロダン

2
@aprodanデモ画像はGitHubからコピーされたものですが、使用していると思いますがasciinema、その後GIF形式に変換しましたが、よくわかりません。
kenorb

1
実際にはSVG形式なので、おそらくasciicast2vector使用できます。
ケノーブ

27
find <directory_path>  -type f -name "<wildcard-match>"

wildcard-matchでは、一致させたい文字列を指定できます。例:* .c(すべてのcファイル)


1
指定されたとおりにファイルを検索するだけなので、あなたの答えはここで最初の最も正しいです。タイプを指定しない他のものはディレクトリを返します。
wilsotc 2017年

ディレクトリを検索する場合は、「
type

11

以下を使用できます。

# find . -type f  -name 'text_for_search'

REGXを使用する場合 -iname

# find . -type f  -iname 'text_for_search'

9

次のコマンドは、現在のフォルダとそのサブフォルダにある「パターン」などの正確な名前を持つすべてのファイルを一覧表示します。

find ./ -name "pattern"


8

再帰的なファイルを検索するためのデフォルトの方法であり、ほとんどの場合で利用可能です

find . -name "filepattern"

現在位置している現在のディレクトリ内から、ファイル名またはパターンの再帰トラバースを開始します。findコマンドを使用すると、ワイルドカードとさまざまなスイッチを使用して、オプションの完全なリストを表示できます。

man find

または、システムでmanページが利用できない場合

find --help

ただし、ファイルシステム全体をトラバースしてファイルにインデックスを付ける、よりモダンで高速なツールがあります。そのような一般的なツールの1つは、locateまたはslocate / mlocateです。インストール方法については、OSのマニュアルを確認してください。インストールされている場合、データベースを開始する必要があります。インストールスクリプトがそれを実行しない場合は、次のように入力して手動で実行できます。

sudo updatedb

そして、それを使用して特定のファイルタイプを探すには

locate filename

または、現在のディレクトリからファイル名またはパターンを検索するには、次のように入力します。

 pwd | xargs -n 1 -I {} locate "filepattern"

ファイルのデータベースを調べ、入力したパターンに一致するパス名をすばやく出力します。検索のオプションの完全なリストを表示するには、次のように入力します。 locate --helpまたはman locate

さらに、cronジョブを介してスケジュールされた時間にデータベースを更新するようにLocateを構成できるため、午前1時にデータベースを更新するサンプルcronは次のようになります。

0 1 * * * updatedb

ファイルシステム全体を走査するには、updatedbにはroot特権が必要なため、これらのcronジョブはrootで構成する必要があります。


7

ファイル検索用
find / -xdev -name settings.xml ->コンピュータ全体
find ./ -xdev -name settings.xml ->現在のディレクトリ

と拡張子タイプのファイルのサブディレクトリ

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

6

再帰的に移動するときに、locateがあまり使用されないことに驚いています。

最初に「$ PWD」を検索して、対象の現在のフォルダーにあるファイルのリストを取得し、次にそれらに対してgrepsを実行します。

locate "$PWD" | grep -P <pattern>

もちろん、これは、updatedbが実行され、インデックスが定期的に更新されることを前提としています。これは、検索を実行してツリーの下に行くように求めるよりも、ファイルを検索する方がはるかに速い方法です。完全を期すためにこれに言及します。ツリーがそれほど重くない場合は、findを使用しても何も起こりません。


locate "$PWD*.mp4" スキップできる可能性があることを思い出させるためにgrep
ジェファーリー洞窟

5

以下のコマンドは、すべてのファイルを検索するのに役立ちます

。1)ケースに関係なく
2)結果許可なしにフォルダを除外します
。3)ルートまたは好きなパスから検索します。/を希望のパスに変更します。

構文:
find -iname '' 2>&1 | grep -v "Permission denied"の


find / -iname 'C * .xml' 2>&1 | grep -v "Permission denied"

find / -iname '*C*.xml'   2>&1 | grep -v "Permission denied"

1
いったいなぜそのためにgrepを使うのですか?stderrをnullにリダイレクトするだけfind / -iname '*C*.xml' 2>/dev/null
phuclv

3

ワイルドカードを使用して特殊ファイルを検索する場合は、次のコードを使用できます。

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

ここからすべての.confファイルを検索するとします。

.ここから検索を開始することを意味します(現在の場所)
-typeここにファイル(f)である検索項目のタイプを意味します。* .conf名の
-nameファイルを検索することを意味します。


3

これにより、現在のディレクトリとサブディレクトリにあるすべての関連ファイルが検索され、行数が個別に計算され、全体として計算されます。

find . -name "*.wanted" | xargs wc -l

2

使用する

find path/to/dir -name "*.ext1" -o -name "*.ext2"

説明

  1. 最初のパラメータは、検索するディレクトリです。
  2. デフォルトでは findは再帰を行います。
  3. -o略です-or。したがって、上記は、このワイルドカードまたはこのワイルドカードを検索することを意味します。パターンが1つしかない場合は、-o
  4. ワイルドカードパターンを囲む引用符は必須です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.