web-dev-qa-db-ja.com

文字列を含む名前のすべてのファイルを検索

現在のディレクトリからファイル名に文字列を含むファイルを返すコマンドを探しています。 locateおよびfindコマンドで、何かfirst_Word*で始まるファイルまたは何か*.jpgで終わるファイルを見つけることができるコマンドを見ました。

ファイル名に文字列を含むファイルのリストを返すにはどうすればよいですか?

たとえば、2012-06-04-touch-multiple-files-in-linux.markdownが現在のディレクトリ内のファイルだったとします。

このファイルや文字列touchを含むファイルを返すにはどうすればよいですか。 find '/touch/'などのコマンドを使用する

143
Dru

findを使用してください。

find . -maxdepth 1 -name "*string*" -print

カレントディレクトリ内の "string"を含むすべてのファイルを検索し(再帰的に使用する場合はmaxdepth 1を削除します)、それを画面に表示します。

「:」を含むファイルを避けたい場合は、次のように入力します。

find . -maxdepth 1 -name "*string*" ! -name "*:*" -print

grepを使用したい場合(ただし、ファイルの内容を確認したくない場合は必要ないと思います)、次の方法を使用できます。

ls | grep touch

しかし、繰り返しますが、findはあなたのタスクにとってより良い、よりクリーンなソリューションです。

235
Zagorax

次のようにgrepを使用してください。

grep -R "touch" .

-Rは再帰を意味します。サブディレクトリに移動したくない場合は、スキップしてください。

-iは「大文字と小文字を区別しない」という意味です。あなたも試してみる価値があるかもしれません。

13
carlspring

以下のように、-maxdepthオプションは-nameオプションの前になければなりません。

find . -maxdepth 1 -name "string" -print
4
Sunil Dias
find $HOME -name "hello.c" -print

これは、$HOME(すなわち/home/username/)システム全体で「hello.c」という名前のファイルを検索し、それらのパス名を表示します。

/Users/user/Downloads/hello.c
/Users/user/hello.c

ただし、HELLO.CまたはHellO.Cとは一致しません。大文字と小文字を区別しないようにするには、次のように-inameオプションを渡します。

find $HOME -iname "hello.c" -print

出力例:

/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c

ファイルのみを検索するには-type fオプションを渡します。

find /dir/to/search -type f -iname "fooBar.conf.sample" -print
find $HOME -type f -iname "fooBar.conf.sample" -print

-inameは、GNUまたはBSD(OS Xを含む)のバージョン検索コマンドで機能します。使用しているバージョンのfindコマンドが-inameをサポートしていない場合は、grepコマンドを使用して次の構文を試してください。

find $HOME | grep -i "hello.c"
find $HOME -name "*" -print | grep -i "hello.c"

または試してみる

find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print

出力例:

/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c
2
shilovk
grep -R "somestring" | cut -d ":" -f 1
0
Saurabh kukade

すでに提供されている多くの解決策に代わるものはglob **を利用することです。 bashをオプションglobstarshopt -s globstar)と一緒に使用する場合、またはzshを使用する場合は、単にglob **を使用できます。

**/bar

barという名前のファイルを再帰的にディレクトリ検索します(現在のディレクトリのファイルbarを含む可能性があります)。同じパスセグメント内で他の形式のグロビングと組み合わせることはできません。その場合、*演算子は通常の効果に戻ります。

ここでzshbashの間には微妙な違いがあることに注意してください。 bashはディレクトリへのソフトリンクを通過しますが、zshは通過しません。これを行うには、zshでglob ***/を使用する必要があります。

0
kvantour
find / -exec grep -lR "{test-string}" {} \;
0
Shahid

文字列が名前の先頭にある場合は、これを実行できます。

$ compgen -f .bash
.bashrc
.bash_profile
.bash_Prompt
0
Steven Penny