現在のディレクトリからファイル名に文字列を含むファイルを返すコマンドを探しています。 locate
およびfind
コマンドで、何かfirst_Word*
で始まるファイルまたは何か*.jpg
で終わるファイルを見つけることができるコマンドを見ました。
ファイル名に文字列を含むファイルのリストを返すにはどうすればよいですか?
たとえば、2012-06-04-touch-multiple-files-in-linux.markdown
が現在のディレクトリ内のファイルだったとします。
このファイルや文字列touch
を含むファイルを返すにはどうすればよいですか。 find '/touch/'
などのコマンドを使用する
find
を使用してください。
find . -maxdepth 1 -name "*string*" -print
カレントディレクトリ内の "string"を含むすべてのファイルを検索し(再帰的に使用する場合はmaxdepth 1
を削除します)、それを画面に表示します。
「:」を含むファイルを避けたい場合は、次のように入力します。
find . -maxdepth 1 -name "*string*" ! -name "*:*" -print
grep
を使用したい場合(ただし、ファイルの内容を確認したくない場合は必要ないと思います)、次の方法を使用できます。
ls | grep touch
しかし、繰り返しますが、find
はあなたのタスクにとってより良い、よりクリーンなソリューションです。
次のようにgrepを使用してください。
grep -R "touch" .
-R
は再帰を意味します。サブディレクトリに移動したくない場合は、スキップしてください。
-i
は「大文字と小文字を区別しない」という意味です。あなたも試してみる価値があるかもしれません。
以下のように、-maxdepth
オプションは-name
オプションの前になければなりません。
find . -maxdepth 1 -name "string" -print
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
grep -R "somestring" | cut -d ":" -f 1
すでに提供されている多くの解決策に代わるものはglob **
を利用することです。 bash
をオプションglobstar
(shopt -s globstar
)と一緒に使用する場合、またはzsh
を使用する場合は、単にglob **
を使用できます。
**/bar
bar
という名前のファイルを再帰的にディレクトリ検索します(現在のディレクトリのファイルbar
を含む可能性があります)。同じパスセグメント内で他の形式のグロビングと組み合わせることはできません。その場合、*
演算子は通常の効果に戻ります。
ここでzsh
とbash
の間には微妙な違いがあることに注意してください。 bash
はディレクトリへのソフトリンクを通過しますが、zsh
は通過しません。これを行うには、zsh
でglob ***/
を使用する必要があります。
find / -exec grep -lR "{test-string}" {} \;
文字列が名前の先頭にある場合は、これを実行できます。
$ compgen -f .bash
.bashrc
.bash_profile
.bash_Prompt