ファイルの内容ではなくファイル名を「grep」する方法


135

grepは、ファイル内を検索して、特定の正規表現に一致する行があるかどうかを確認するために使用されます。しかし、私はこの状況にあります-(ファイルの内容ではなく)ファイル名自体に一致する正規表現を書きたいのです。これをシステムのルートディレクトリから実行して、正規表現に一致するすべてのファイルを見つけます。

たとえば、 "f"で始まり.frmで終わるすべてのVBフォームファイルを検索するには、正規表現を使用します-

   "f[[:alnum:]]*\.frm"

grepはこれを行うことができますか?そうでない場合、これを実行できるユーティリティはありますか?ありがとう。

回答:


120

この場合はのfind代わりにを使用する必要がありますgrep

またはfindと組み合わせて使用することもできます。grepegrep

$ find | grep "f[[:alnum:]]\.frm"

12
これは不要です。Findには、-regexオプションでその機能が組み込まれています。
2014

4
ここでは不要ですが、grepはperl正規表現をサポートしていますが、findはサポートしていません。
Dan

2
いいえ、grepを使用できます。検索を使用するよりもはるかに簡単です。スイッチ「-rl」を追加すると、ファイルではなくファイル名が検索されます。以下の私の投稿を参照してください。
RM

@ alpha_989、私はgrepがそれをサポートすることを言った、それはそれをする:gnu.org/software/grep/manual/html_node/… ポイントは、pcreが必要な場合にのみ必要なgrepへのパイプです。whereswaldenの正解
Dan

60

find <path> -name *FileName*

マニュアルから:

名前パターンを見つける

ファイル名のベース(先頭のディレクトリが削除されたパス)は、シェルパターンパターンと一致します。先頭のディレクトリが削除されるため、-nameとの一致が考慮されるファイル名にはスラッシュが含まれないため、「-name a / b」は何にも一致しません(代わりに-pathを使用する必要があります)。メタ文字(「*」、「?」、および「[]」)は「。」に一致します。ベース名の先頭(これはfind-utils-4.2.2での変更です。以下の「標準への準拠」のセクションを参照してください)。ディレクトリとその下のファイルを無視するには、-pruneを使用します。-pathの説明の例を参照してください。Bashを含む一部のシェルがシェルパターンで特別な意味を持つブレースを挿入するという事実にもかかわらず、ブレースは特別なものとして認識されません。ファイル名のマッチングは、fnmatch(3)ライブラリ関数を使用して実行されます。シェルによる拡張からパターンを保護するために、パターンを引用符で囲むことを忘れないでください。


2
この回答が最も役に立ちました。:私は、追加オプションのカップルを追加 find . -maxdepth 1 -name "*filename*" -print
JSON C11

47

Pabloが言ったように、のfind代わりにを使用する必要がありますが、grepにパイプfindする必要はありませんgrepfindその機能が組み込まれています:

find . -regex 'f[[:alnum:]]\.frm'

find名前でファイルを検索するための非常に強力なプログラムであり、ファイルタイプによる検索、深さ制限、さまざまな検索語とブール演算の組み合わせ、見つかったファイルに対する任意のコマンドの実行をサポートします。詳細については、findのマニュアルページ参照してください。


1
-mtimeandを使用して日付で検索する検索の非常に便利な機能を追加します-mmin
Johnride

1
また、-regexスイッチはパス全体との一致を実行します。したがって、例を機能させるには、正規表現の先頭に。*を追加する必要があります。
tumasgiu

15

grepを使用してファイルの完全なパスを見つけることができます。ツリーの出力をパイプするだけです

tree -f | grep filename

これが.bash_profileまたは.bashrcに入れることができる関数です

findfile(){ tree -f | grep $1; } # $1 = filename, -f is full path

-fはオプションです。
jasonleonhard

10
find -iname "file_name"

Syntax :-
find -type type_descriptor file_name_here

type_descriptorタイプ:-

f:通常のファイル

d:ディレクトリ

l:シンボリックリンク

c:キャラクターデバイス

b:ブロックデバイス


1
-type typedescriptor一人に続いてファイル名を使うことができないようです。これは間違いですか?
AllanNørgaard16年

5

あなたも行うことができます:

tree | grep filename

これにより、treeコマンドの出力が検索のためにgrepにパイプされます。ただし、ファイルが存在するかどうかのみがわかります。


1

いいえ、grepはこれで問題なく動作します。

 grep -rl "filename" [starting point]

 grep -rL "not in filename"

1
これにより、ファイルの内容で「filename」が検索され、一致するファイルの名前が出力されます。OPは、ファイルの内容ではなく、一致するファイル名を要求します。
マシュー

1
同意しましたが、これはファイル名を検索するのではなく、コンテンツが一致することが判明したファイル名の名前を出力するだけです。-l-Lオプションの両方をかなり誤解しています。
プロメテウス

2
自分が必要とするものであるための+1。幸せなことに、必要な答えを見つけるために質問を批判する必要がありませんでした
Alexander McNulty


-1

最も簡単な方法は

find . | grep test

ここでfindは、(。)、つまり現在のディレクトリにあるすべてのファイルを再帰的に一覧表示します。そして、それは単なる単純なgrepです。名前に「test」が付いているすべてのファイルが表示されます。

必要に応じてgrepで遊ぶことができます。注:grepは一般的な文字列分類であるため、ファイル名だけでなく、ただし、パスにディレクトリがある場合( '/xyz_test_123/other.txt')も結果セットになります。乾杯


これは、パスに "test"が含まれるものをすべて検索します./foo/bar/latest/fred.txt
ポールR

ああ。考えていなかったあれ。言及していただきありがとうございます。
sachyy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.