回答:
既存の回答を完了するには:
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
、次のような特定のパターンを検索することもできます。
tree -P 'abc*' # list directory tree of file starting with abc---
tree -l 'def*' # exclude files starting with def---
この場合、tree
それ自体がワイルドカードをサポートします。
ls
ディレクトリを一覧表示するように要求すると、ディレクトリが開かれるため、実行するのと同じls -l BirthdayPhotos
です。この動作を抑制するには、を使用しls -d B*
ます。
B*
ディレクトリ仕様として扱うのですか?
B*
すると、開始するすべてのディレクトリに一致するように展開されるB
ためls
、実際にはディレクトリのリストを渡すため、すべてのディレクトリが開かれます。
ls -d ABC*
著者が尋ねていたものでした。また、コードスニペットのコメントは間違っており、abcで始まるディレクトリのコンテンツをls abc*
リストします。
実行する方法に応じて、多くの方法があります。一般に、それらを単にリストしたい場合は、以下を使用して端末で実行できます。
find | grep '^\./ABC'
...そしてABC
テキストに置き換えます。
コマンドを理解するために、少し分解してみましょう。
find
現在のディレクトリとそのサブディレクトリの下にあるすべてのファイルをリストします。単独で使用すると、そこにすべてがリストされます。find
は./
、で始まる各ファイルまたはディレクトリを出力し、それらのパスが現在のディレクトリに相対的であることを示していることに注意してください。これを認識することは重要です。というの./ABC
は、だけでなくで始まる結果を検索するからABC
です。
パイプ文字|
は、あるコマンドの出力を別のコマンドにfind
リダイレクトしgrep
ます。この場合、の出力はにリダイレクトされます。これはパイピングと呼ばれます。
grep
出力を取得し、指定されたパターンを使用してフィルタリングし^\./ABC
ます。
' '
シェルが内部の特殊文字を解釈しないように、パターンは単一引用符で囲まれていることに注意してください。現在、パターン自体は、正規表現または略してregexと呼ばれる特定の構文で記述されています。正規表現は、習得すれば非常に強力な検索ツールであり、このようなサイトについて詳しく説明しているサイトもありますがgrep
、本格的な正規表現エンジンではなく、すべてを行うことはできないことに注意してください。
私たちの目的のために:
^
正規表現では、文字列の先頭に一致します。これにより、ファイル名の先頭でパターンが一致しない場合、パターンに一致しなくなります。
.
正規表現では、特別な意味もあります。「ここで任意の1文字に一致する」という意味です。リテラルドットとして使用する場合は、その\
前にバックスラッシュを使用して「エスケープ」する必要があります。(ええ、私たちの場合、任意の文字に一致することは無害ですが、完全を期すために行いました。)
find | grep
find
GREPを使用できます。これは最も簡単なソリューションだと思います。おそらく、他のgrepパラメータを追加して、一致をより正確にすることもできます。
tree | grep ABC
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
最初に実行する必要があります。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 },".")'
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
ファイルが存在するディレクトリ内でコマンドを実行するとします。
echo /path/to/files/ABC* | tr " " "\n"
は良い考えではありません。ファイルがある場合/path/to/files/ABC EFG
、ファイル名にスペースがあることを考慮してください。あなたtr
はファイル名を2つの別々の行に分けますが、これは良くありません。さらに悪いことに、ファイル名に複数のスペースがある場合。printf "%s\n" ABC*
代わりに使用することをお勧めします。これはファイル名にスペースを入れるのに役立ちますが、次のような他の特殊文字にはまだ問題があります\n
私のお気に入りのvimプラグインの1つであるCommand-tは、FZFとの統合よりも上のルビーベースのプラグインです。
Comamnd-TとFZFを使用することにより、次のような非常に高速な「ファジー」メカニズムで検索を実行できます。
ご覧のように
私は常に新しいターミナルを開いてコマンド履歴を検索し、ヒットします:
CTRL+R
端末タブに書き込むことにより、すべてのフォルダーを再帰的に検索することに加えて:
fzf
次に、ファイル名を開始します
ABC
また、内部に書くことができます vim
:CommandT
特に大きなフォルダーで特に役立ちます。
私がルートディレクトリにいて、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
ls -l B*
の内容が表示されるのB
ですか?