ディレクトリ内の「ABC」という名前で始まるすべてのファイルを検索する方法は?


58

特定の名前で始まるファイルを検索する必要があります。特定のパターンで始まる複数のファイルが存在する可能性があり、ディレクトリに存在するそのようなファイルをすべてリストしたいと思います。

回答:


60

既存の回答を完了するには:

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それ自体がワイルドカードをサポートします。


2
なぜ一致するディレクトリの名前だけではなく、すべてのディレクトリls -l B*内容が表示されるのBですか?
エリック

@ErikE lsディレクトリを一覧表示するように要求すると、ディレクトリが開かれるため、実行するのと同じls -l BirthdayPhotosです。この動作を抑制するには、を使用しls -d B*ます。
アゾールアハイ

@AzorAhaiしかし、なぜB*ディレクトリ仕様として扱うのですか?
エリク

@ErikEファイルglobを使用B*すると、開始するすべてのディレクトリに一致するように展開されるBためls、実際にはディレクトリのリストを渡すため、すべてのディレクトリが開かれます。
アゾールアハイ

1
質問に答えません。ls -d ABC*著者が尋ねていたものでした。また、コードスニペットのコメントは間違っており、abcで始まるディレクトリのコンテンツls abc*リストします。
greatvovan

42

findコマンドを使用して、パターンでファイルを検索できます

find . -type f -name "abc*" 

上記のコマンドは、現在の作業ディレクトリの下にあるabcで始まるファイルを検索します。

-name 'abc'完全に一致するファイルがリストされます。例:abc

使用することもできます

 -iname
 -regex 

findパターンを使用してファイル名を検索するコマンドのオプション


7

実行する方法に応じて、多くの方法があります。一般に、それらを単にリストしたい場合は、以下を使用して端末で実行できます。

find | grep '^\./ABC'

...そしてABCテキストに置き換えます。

コマンドを理解するために、少し分解してみましょう。

  • find現在のディレクトリとそのサブディレクトリの下にあるすべてのファイルをリストします。単独で使用すると、そこにすべてがリストされます。find./、で始まる各ファイルまたはディレクトリを出力し、それらのパスが現在のディレクトリに相対的であることを示していることに注意してください。これを認識することは重要です。というの./ABCは、だけでなくで始まる結果を検索するからABCです。

  • パイプ文字|は、あるコマンドの出力を別のコマンドにfindリダイレクトしgrepます。この場合、の出力はにリダイレクトされます。これはパイピングと呼ばれます。

  • grep出力を取得し、指定されたパターンを使用してフィルタリングし^\./ABCます。

    • ' 'シェルが内部の特殊文字を解釈しないように、パターンは単一引用符で囲まれていることに注意してください。
  • 現在、パターン自体は、正規表現または略してregexと呼ばれる特定の構文で記述されています。正規表現は、習得すれば非常に強力な検索ツールであり、このようなサイトについて詳しく説明しているサイトもありますがgrep、本格的な正規表現エンジンではなく、すべてを行うことはできないことに注意してください。

  • 私たちの目的のために:

    • ^正規表現では、文字列の先頭に一致します。これにより、ファイル名の先頭でパターンが一致しない場合、パターンに一致しなくなります。

    • .正規表現では、特別な意味もあります。「ここで任意の1文字に一致する」という意味です。リテラルドットとして使用する場合は、その\前にバックスラッシュを使用して「エスケープ」する必要があります。(ええ、私たちの場合、任意の文字に一致することは無害ですが、完全を期すために行いました。)


1
なぜだろうあなた自身の完璧なパターンマッチング機能を持っていますか?find | grepfind
ダラエル

3

GREPを使用できます。これは最も簡単なソリューションだと思います。おそらく、他のgrepパラメータを追加して、一致をより正確にすることもできます。

tree | grep ABC

2

Nautilusファイルマネージャと正規表現を使用して、特定のパターンを検索できます。

これを行うには、以下のようなギアメニューで[一致するアイテム選択 ]をクリックします(Ctrl+を押すこともできますs)。

ここに画像の説明を入力してください

次に、正規表現 ABC*を入力して検証します。

ここに画像の説明を入力してください

名前がパターンに一致するすべてのファイルが自動的に選択されます。

ここに画像の説明を入力してください

Ubuntu 12.10(Quantal)上のGNOME3 PPAのNautilus 3.6。*を使用しています。


1

私にとって最も簡単な解決策

ls | grep PATTERN

ここでは、PATTERNで任意の正規表現を指定できます。

たとえば、名前に「ab」が含まれるファイルを検索するには、次のように入力します

ls | grep ".*ab.*"

「ab」で始まるファイルを見つけるには、次のように入力します

ls | grep "^ab"

1

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

ノート:

  • 上記のコマンドは、100万のファイルで実行するのに1秒かかります。
  • これに対して、ルートディレクトリfindから開始するコマンドは非常に長い時間を要し、多くのアクセス許可エラーを生成します。/
  • 今日ファイルが作成された場合、sudo updatedb最初に実行する必要があります。

0

私が使う

ls | grep abc

または

ls -la | grep abc

abcで始まるだけでなく、すべてのファイルがabcで表示されます。しかし、これを行うのは私にとって非常に簡単な方法です。


0

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  },".")' 

0
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
Sergiy Kolodyazhnyy

0

私のお気に入りのvimプラグインの1つであるCommand-tは、FZFとの統合よりも上のルビーベースのプラグインです。

Comamnd-TとFZFを使用することにより、次のような非常に高速な「ファジー」メカニズムで検索を実行できます。

  • ファイルとバッファを開く
  • タグへのジャンプとヘルプ
  • コマンドの実行、または以前の検索とコマンド
  • 最小限のキーストロークで。

ご覧のように

ここに画像の説明を入力してください

私は常に新しいターミナルを開いてコマンド履歴を検索し、ヒットします:

CTRL+R

端末タブに書き込むことにより、すべてのフォルダーを再帰的に検索することに加えて:

fzf

次に、ファイル名を開始します

ABC

また、内部に書くことができます vim

:CommandT 

特に大きなフォルダーで特に役立ちます。


0

私がルートディレクトリにいて、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.