特定の名前で始まるファイルを検索する必要があります。特定のパターンで始まる複数のファイルが存在する可能性があり、ディレクトリに存在するすべてのそのようなファイルをリストしたいと思います。
既存の回答を完了するには:
ls
デフォルトのディレクトリリストユーティリティls
は、シェルのワイルドカードと組み合わせて使用できます。パターンabc
ですべてのファイルを検索するには:
ls abc* # list all files starting with abc---
ls *abc* # list all files containing --abc--
ls *abc # list all files ending with --abc
ファイル拡張子は検索結果にも関連することに注意してください。
tree
ディレクトリツリーのファイルをリストする必要がある場合は、tree
を発行して、指定された pattern を検索することもできます。
tree -P 'abc*' # list directory tree of file starting with abc---
tree -l 'def*' # exclude files starting with def---
この場合、tree
自体がワイルドカードをサポートします。
find
コマンドを使用して、パターンでファイルを検索できます
find . -type f -name "abc*"
上記のコマンドは、現在の作業ディレクトリの下にあるabcで始まるファイルを検索します。
-name 'abc'
は、完全に一致するファイルをリストします。例:abc
使用することもできます
-iname
-regex
パターンを使用してファイル名を検索するfind
コマンドのオプション
実行する方法に応じて、多くの方法があります。一般に、それらを単にリストしたい場合は、以下を使用して端末で実行できます。
find | grep '^\./ABC'
... ABC
をテキストに置き換えます。
コマンドを理解するために、少し分解してみましょう。
find
は、現在のディレクトリとそのサブディレクトリの下にあるすべてのファイルをリストします。単独で使用すると、そこにすべてがリストされます。 find
は、./
で始まる各ファイルまたはディレクトリを出力し、それらのパスが現在のディレクトリに相対的であることを示すことに注意してください。これは、ABC
だけでなく./ABC
で始まる結果を検索することを意味するため、これに注意することが重要です。
パイプ文字|
は、あるコマンドの出力を別のコマンドにリダイレクトします。この場合、find
の出力はgrep
にリダイレクトされます。これはパイピングと呼ばれます。
grep
は出力を取得し、指定されたパターン^\./ABC
を使用してそれをフィルタリングします。
' '
で引用されていることに注意してください。パターン自体は、正規表現または略してregexと呼ばれる特定の構文で記述されています。 Regexは、マスターすれば非常に強力な検索ツールであり、 this などのサイトで詳細を説明していますが、grep
は本格的な正規表現ではないことに注意してくださいエンジンとあなたはそれですべてを行うことはできません。
私たちの目的のために:
正規表現の^
は、文字列の先頭に一致します。これにより、ファイル名の先頭でパターンが一致しない場合、パターンに一致しなくなります。
正規表現の.
には特別な意味もあります。これは「ここの任意の1文字に一致する」という意味です。リテラルドットとして使用する場合は、その前にバックスラッシュ\
を使用して「エスケープ」する必要があります。 (ええ、私たちの場合、任意の文字に一致させることは無害ですが、完全を期すために行いました。)
gREPを使用できます。これは最も簡単なソリューションだと思います。おそらく、他のgrepパラメータを追加して、一致をより正確にすることもできます。
tree | grep ABC
私にとって最も簡単な解決策
ls | grep PATTERN
ここでは、PATTERNで任意の正規表現を指定できます。
たとえば、名前に「ab」が含まれるファイルを検索するには、次のように入力します
ls | grep ".*ab.*"
「ab」で始まるファイルを見つけるには、次のように入力します
ls | grep "^ab"
ABC*
ファイルがあるディレクトリがわからず、数百万のファイルがある場合は、locate
コマンドが最速の方法です。
$ locate /ABC
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABC6AD2FEC16465049B48D39FD2FE538258F2A34
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABCBFDA54262F47253F95ED6ED4131A465EE0E39
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
/mnt/old/home/rick/.cache/mozilla/firefox/3vkvi6ov.default/cache2/entries/ABC0C99FCEABAD0C6AA2078CD025A1CDE48D7BA1
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
注:
/
ルートディレクトリで始まるfind
コマンドは非常に長い時間になり、多くの許可エラーを生成します。Sudo updatedb
を実行する必要があります。私がルートディレクトリにいて、etcディレクトリのリストだけが必要だと仮定します。
find -type d -name "etc"
私たちが得る結果、
[root@unix /]# find -type d -name "etc"
./etc
./usr/lib/firefox/bundled/etc
./usr/lib/unix-yarn/etc
./usr/lib/unix/etc
./usr/lib/festival/etc
./usr/bin/lib/vmware-tools/lib64/libconf/etc
./usr/bin/lib/vmware-tools/lib32/libconf/etc
./usr/etc
./usr/share/doc/oddjob-0.30/sample/etc
./usr/share/festival/lib/etc
./usr/local/etc
./usr/Java/jdk1.7.0_25/lib/visualvm/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib64/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib32/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/caf/etc
もう一つの例、
また、次のように書くこともできます。
ls | grep "etc"
我々が得る、
etc
printf "%s" /path/to/files/ABC*
これは、両端で固定されているグロブパターンマッチングです。これは、「ABC」、「ABC.txt」、「ABC123」などの「ABC」で始まるファイルのすべてのオカレンスに一致しますが、「xABC」には一致しません。ここで 'printf'の代わりに 'ls'を使用するコマンドラインでは安全な代替方法ですが、同意する人の意見によっては、 'ls'をスクリプトで使用するのは安全ではありません。その場合、globprintパターンマッチングで 'printf'を使用することは安全と見なされます。スクリプトでこれを使用する場合、「printf」の出力には、出力ストリームの最後まで改行文字が含まれません。
printf "%s" /path/to/files/ABC*
返却値:
/path/to/files/ABC /path/to/files/ABC123
各インスタンスの後に改行が必要な場合:
printf "%s\n" /path/to/files/ABC*
返却値:
/path/to/files/ABC
/path/to/files/ABC123
「/ path/to/files /」は、「printf」コマンドを実行したときにそのように入力した場合、出力に残ります。それなしでは、ファイル名のみが表示されます。
printf "%s" ABC*
返却値
ABC ABC123
ファイルが存在するディレクトリ内でコマンドを実行すると仮定します。
私が使う
ls | grep abc
または
ls -la | grep abc
Abcで始まるだけでなく、すべてのファイルがabcで表示されます。しかし、これを行うのは私にとって非常に簡単な方法です。
Command-t 私のお気に入りのvimプラグインの1つで、それはRubyベースのプラグインです FZF。
Comamnd-TとFZFを使用することにより、次のような非常に高速な「ファジー」メカニズムで検索を実行できます。
ご覧のように
私は常に新しいターミナルを開いてコマンド履歴を検索し、ヒットします:
CTRL+R
端末タブに書き込むことにより、すべてのフォルダーを再帰的に検索することに加えて:
fzf
次に、ファイル名を開始します
ABC
また、内部にvim
と書くことができます
:CommandT
特に大きなフォルダーで特に役立ちます。
Python:
$ python -c 'import sys,os;found=[os.path.join(r,i) for r,s,f in os.walk(".") for i in f if i.startswith("ABC")];map(lambda x: sys.stdout.write(x+"\n") ,found)'
Perl:
$ Perl -le 'use File::Find;find(sub{ -f && $_ =~/^ABC/ && print $File::Find::name },".")'