web-dev-qa-db-ja.com

ファイル拡張子をgrepする方法

私は現在、入力をgrepして特定のファイルタイプ(たとえば、Zip)かどうかを確認するスクリプトを作成しようとしていますが、ファイルタイプの前のテキストは何でもかまいません。

_something.Zip
this.Zip
that.Zip
_

すべてカテゴリに分類されます。私はワイルドカードを使用してこれらをgrepしようとしていますが、これまでのところこれを試しました

_grep ".*.Zip"
_

しかし、それを行うたびに、_.Zip_ファイルは問題なく見つかりますが、_.Zip_の後に追加の文字がある場合、たとえば_.zippppppp_または_.zipdsjdskjc_はまだgrepによって取得されます。そうは言っても、grepが_.Zip_の後に追加の文字がある一致を表示しないようにするにはどうすればよいですか?

16
lacrosse1991

行の終わりを$でテストし、2番目の.をバックスラッシュでエスケープして、ピリオドのみに一致し、文字には一致しないようにします。

grep ".*\.Zip$"

ただし、現在のディレクトリにあるすべてのls *.Zipファイル、またはサブディレクトリにあるすべての.Zipファイルのfind . -name "*.Zip"を一覧表示する場合は、.Zipがより自然な方法です。 (を含む)から始まり、現在のディレクトリ。

51
Chris Seymour

UNIXでは、次を試してください。

find . -name \*.Zip -print
14
Student

いくつかのことを行う必要があります。次のようになります。

grep '.*\.Zip$'

2番目のドットをエスケープする必要があるため、文字とは一致せず、ドットとのみ一致します。単一引用符を使用すると、エスケープが少し簡単になります。

行の最後にドル記号が必要です。これは、行の最後に「Zip」が発生することを示すためです。

5
Vaughn Cato

これを使用して、フォルダー内のファイルの種類の一覧を取得します。

find . -type f | egrep -i -E -o "\.{1}\w*$" | sort -su

たとえば、出力:

.DS_Store
.MP3
.aif
.aiff
.asd
.doc
.flac
.jpg
.m4a
.m4p
.m4r
.mp3
.pdf
.png
.txt
.wav
.wma
.Zip

ボーナス:と

find . -type f | egrep -i -E -o "\.{1}\w*$" | sort | uniq -c

ファイル数を取得します:

    106 .DS_Store
     35 .MP3
     89 .aif
      5 .aiff
    525 .asd
      1 .doc
     60 .flac
     48 .jpg
    149 .m4a
     11 .m4p
      1 .m4r
  12844 .mp3
      1 .pdf
      5 .png
      9 .txt
    108 .wav
     44 .wma
      2 .Zip
2
index opout

試してください:grep -o -E "(\\.([A-z])+)+"

これを使用して、マルチドット/複数の拡張機能を取得しました。したがって、入力が_hello.tar.gz_の場合、_.tar.gz_が出力されます。シングルドットの場合は、grep -o -E "\\.([A-z])+$"を使用します。 Cygwin/MingW + MSYSでテスト済み。

2
dsrdakota

Grepを使用して、特定の拡張子を持つすべてのファイルを見つけることもできます。

find .|grep -e "\.gz$"

.は現在のフォルダーを意味します。現在のフォルダー以外のフォルダーを指定する場合は、.をフォルダーのパスに置き換えてください。次に例を示します。.gzで終わり、/ var/logフォルダーにあるすべてのファイルを検索します。

  find /var/log/ |grep -e "\.gz$"

出力は次のようになります。

 ✘ ⚙> find /var/log/ |grep -e "\.gz$"

/var/log//mail.log.1.gz
/var/log//mail.log.0.gz
/var/log//system.log.3.gz
/var/log//system.log.7.gz
/var/log//system.log.6.gz
/var/log//system.log.2.gz
/var/log//system.log.5.gz
/var/log//system.log.1.gz
/var/log//system.log.0.gz
/var/log//system.log.4.gz

$記号は、基本的にファイル拡張子がgzで終わっていることを示しています

2
Stryker

他の回答のいくつかを確認するだけです。 .*は必要ありません。特定のファイル拡張子を探している場合は、大文字と小文字を区別しないように-iを含めるのが最善です。たとえば、ファイルがHELLO.Zipの場合。引用符も必要ないと思います。

grep -i \.Zip$
1
twasbrillig

上記の例のもう1つの修正/アドオン:

# multi-dotted/multiple extensions
grep -oEi "(\\.([A-z0-9])+)+" file.txt

# single dotted
grep -oEi "\\.([A-z0-9])+$" file.txt

これにより、「。mp3」などのファイル拡張子が取得されます。

1
browseman

単に行う:

grep ".*.Zip$"

「$」は行末を示します

0
AaronO