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


177

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

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

たとえば2012-06-04-touch-multiple-files-in-linux.markdown、現在のディレクトリにファイルがあった場合。

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


質問は紛らわしいです。文字列を含むファイル、または名前に上記の文字列を含むファイルを検索しますか?最初の質問はで回答されman grep、2番目の質問はで回答されman findます。なぜあなたは男を使う代わりにグーグルするのか、私にはわかりません。
ちょうど誰か

1
ありがとう!最初の文は、ファイルの内容なのかファイル名なのかを指定していませんでした。更新しました。
2012

回答:


303

使用find

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

現在のディレクトリでmaxdepth 1「文字列」を含むすべてのファイルを検索し(再帰的に削除する場合は削除します)、画面に出力します。

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

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

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

ls | grep touch

しかし、私は繰り返しfindますが、あなたの仕事のためのより良い、よりクリーンなソリューションです。


@Zagoraxに感謝します。これはまさにそれを行います。コマンドがそれほど長くなかったことを願っていますが、:)
Dru

2
@Dru、コロンを避けたい場合はケースをカバーするように変更されました。find非常に強力なツールであり、何となく「長い」ものでなければなりません。:)
Zagorax 2012

最初の人はコンテンツを返さずに完全にそれをしてくれてありがとう。
Druの

3
@Dru、これを「短く」したい場合-printは、これがデフォルトの動作であり.、これがチェックするデフォルトのフォルダーであるため、回避できます。
Zagorax

1
find . -name "*string*"うまくいきます。削除.するとエラーが発生します。@Zagoraxに再度感謝します。
Druの

14

次のようにgrepを使用します。

grep -R "touch" .

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

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


すごい。一部のファイルの内容が:。に続くことに気付きました。とにかくそれを差し控えることはありますか?おそらくオプションを使用していますか?
2012

1
試してみてくださいgrep -R "touch" . | cut -d ":" -f 2
carlspring

それはファイルの内容のみを生成するようです。基本的にあなたは私の質問に答えました、私は内容を差し控えるためにいくつかの掘り下げを試みることができます。
Druの

ああ...あなたはファイル名だけが必要ですか?実行します:(grep -R "touch" . | cut -d ":" -f 1 申し訳ありませんがあなたを誤解している必要があります)
carlspring、2012

@carlspringに感謝します。これは興味深いものです。grepの内容とファイル名を含むファイルtouchまたはを含むコンテンツを返すファイルのいずれかが返されますtouch。返されるファイルのリストの半分はtouchタイトルに含まれ、残りの半分touchはタイトルではなく本文に含まれます。これに気づきました。
Druの

5

-maxdepthオプションは、前にする必要があります-name以下のように、オプションを選択します。、

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

1
「文字列」の前後に*を付ける必要があります。
Aerin

3
find $HOME -name "hello.c" -print

これにより、システム全体$HOME(つまり/home/username/)で「hello.c」という名前のファイルが検索され、そのパス名が表示されます。

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

しかし、それはマッチしませんHELLO.CHellO.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バージョンfindコマンド(OS Xを含む)、GNUまたはBSD上のいずれかで動作します。お使いのバージョンのfindコマンドがをサポートしていない場合は-inamegrepコマンドを使用して次の構文を試してください。

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

0

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

$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt

3
compgenこの釘には適切なハンマーではありません。このほとんど使用されないツールは、使用可能なコマンドを一覧表示するように設計されているため、現在のディレクトリ(スクリプトである可能性があります)内のファイルを一覧表示し、再帰したり、ファイル名の先頭を過ぎて見たり、ファイルの内容を検索したりすることはできません。ほとんど役に立たない。
msanford 2014年

0

すでに提供されている多くのソリューションの代替は、グロブを利用することです**。あなたは、使用する場合はbashオプションでglobstarshopt -s globstar)、またはあなたの利用してzsh、あなただけのグロブを使用することができ**、このために。

**/bar

指定されたファイルを再帰的にディレクトリ検索しますbarbar現在のディレクトリにあるファイルを含む可能性があります)。これは、同じパスセグメント内の他の形式のグロビングと組み合わせることはできません。その場合、*オペレーターは通常の効果に戻ります。

間に微妙な違いがあることに注意zshしてbash、ここでは。一方でbash、ディレクトリへのソフトリンクを通過します、zshしません。このためには、グロブを使用する必要が***/zsh


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

1
この回答には低品質のフラグが付けられました。提案された変更の内容を説明してください。
Miroslav Glamuzina

-2
grep -R "somestring" | cut -d ":" -f 1

2
これは別の質問への答えのようです-しかし、あなたが説明を提供しなかったので、それは質問者や他の誰にとっても明白ではありません。
Toby Speight 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.