lsとgrepを使用して特定の拡張子を持つファイルを一覧表示する


152

現在のディレクトリからファイルを取得し、.mp4 .mp3 .exeファイルのみを出力したいだけです。だから私はこれを行うことができると思った:

ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$

しかし、いいえ、最初のgrepはmp4を出力するだけなので、他の2つのgrepは使用されません。

何か案は?PS、Slow Leopardでこのスクリプトを実行しています。


1
これは実際には間違ったアプローチです。grepを使用する代わりに、を使用shopt -s nullglobして参照してください*.exe *.mp3 *.mp4mywiki.wooledge.org/ParsingLs
Charles Duffyを

1
「Slow Leopard」がタイプミスだったかどうか
わかり

1
@Wowfunhappy haha​​ha、間違いなくタイプミスでした。SnowLeopardはかなり高速だと思いました。
ミント、

回答:


335

何故なの:

ls *.{mp3,exe,mp4}

どこで学んだかはわかりませんが、これを使ってきました。


1
私が使用している拡張機能がディレクトリ用であるため、これは私にとっては機能しません。したがって、lsはディレクトリの内容をリストします。
Richard Venable 2013

1
@RichardVenableに-dスイッチを追加して、ディレクトリが再帰されないようにします。
Carlos Eugenio ThompsonPinzón2013年

11
私はこのソリューションが好きですが、いずれかのファイルタイプが欠落していると失敗するようです。たとえば、mp3はあるが.exeがない(Mac OSX、zsh)
JHo

2
私はリダイレクトstderrには/ dev / nullを避けるために、ls: *.exe: No such file or directory例えば:ls *.{zip,tar.gz,tar} 2>/dev/null
アイザック

1
ls foo *。{tar.gz、zip}をシェルで直接実行すると機能しますが、これをシェルスクリプトの中に配置すると、latest = $(ls -I ' .done' -tr $ {pkgprefix}。{tar。 gz、zip} | tail -1)エラーメッセージが表示されました:ls: 'bamtools *。{tar.gz、zip}'にアクセスできません:そのようなファイルやディレクトリはありません。賢い人なら答えを絞り込むことができます。
Kemin Zhou

41

で正規表現を使用するfind

find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\n'

ファイル名をパイピングしている場合:

find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\0' | xargs -0 dosomething

これにより、スペースまたは改行を含むファイル名が保護されます。

OS X findは、-E(拡張)オプションが使用されている場合にのみ代替をサポートします。

find -E . -regex '.*\.(mp3|mp4|exe)'

2
Mac OS Xの場合:find . -iregex '.*\(mp3\|mp4\|exe\)'
andilabs

3
andi、それは私にとってMac OSでは機能しませんでした。しかし、これはそうでした:find -E。-regex '。*(mp3 | mp4 | exe)'
ジョセフジョンソン

このソリューションは次のようなファイルをロードします。正規表現の最後と拡張の前にをmysupermp3.jpg追加することを検討してください$\\.
Panthro

1
@Panthro:実際にはそうしません。Findは暗黙のアンカーを使用しているようです。ドットは良い考えです(バックスラッシュは1つだけ必要です)。
追って通知があるまで一時停止。

38

egrep -拡張grep-ここで役立ちます

ls | egrep '\.mp4$|\.mp3$|\.exe$'

仕事をする必要があります。


それでおしまい!ありがとう大文字と小文字を区別しないでください。lsを使用しています。egrep -i '\ .mp4 $ | \ .mp3 $ | \ .exe $他の誰かがその日に助けを必要とする場合。私はここで私の答えを得る速度にいつも驚いています。
ミント

これがどのように機能するかわかりません。オプションなしのlsは、列に出力を生成します。行末へのアンカーは正しく一致しません。
camh 2009

4
@camh:ls端末に(または-Cオプション付きで)複数列出力を生成します。lsパイプへの(またはを使用した-1)には、単一列の出力があります。(の出力をlsと比較しますls | cat)。
モブ

最後にアポストロフィがありません。それ以外はうまくいくようです。
ビョルン

12

最も簡単な方法は、lsを使用することです

ls *.mp4 *.mp3 *.exe

2
おかげで、私はすでにそれを試しました、そして、ファイルがないときにあなたが得るエラーが好きではありませんでした。汝私は固定のできることを実行してます。ls * .MP4 * .MP3 * .exeの2>を/ dev / null今だけ汝そのことを考えて:P
ミント

1
lsなんらかのサイレントオプションがないことに驚いています。
MitMaro 2009

2
bashでは、「set -o nullglob」を実行でき、エラーは発生しません。
camh 2009

2
私の間違い-これはset -oコマンドではなく「shopt -s nullglob」である必要があります
camh

1
または、単に "echo"を使用します。echo * .mp4 * .mp3 * .exe
Adrian Pronk

9

念のため:なぜ使用しないのですfindか?

find -iname '*.mp3' -o -iname '*.exe' -o -iname '*.mp4'

私はこれが代わりに機能することを発見しました- find . -name '*.mkv' -o -name '*.flv'(必要なだけ-o句を追加します)。.ディレクトリとフラグを示さ-nameないようにする必要がありました-iname-私はmacOS 10.13を使用しています。
Chris

6

grepは必要ありません。シェルのワイルドカードでうまくいきます。

ls *.mp4 *.mp3 *.exe

あなたが実行した場合

shopt -s nullglob

一致しないglobは完全に削除され、展開されていないコマンドラインには残りません。

大文字と小文字を区別しないグロビングが必要な場合(* .mp3はfoo.MP3と一致します):

shopt -s nocaseglob

Good Time Tribeに与えたのと同じコメント。
ミント

1
これを-Rサブディレクトリ内の一致するファイルを一覧表示するオプションと一緒に使用しようとしていますが、このオプションは効果がないようで、現在のディレクトリの結果しか取得できません。
Chris

3

まだ別の解決策を探している場合:

ls | grep -i -e '\\.tcl$' -e '\\.exe$' -e '\\.mp4$'

必要に応じて、-eフラグを追加してください。


3

OSXユーザーの場合

あなたが使用している場合ls *.{mp3,exe,mp4}それはエラーがスローされますそれらのいずれかの拡張子が何の結果を持っていない場合。

を使用ls *.(mp3|exe|mp4)すると、いずれかの拡張子の結果が0の場合でも、それらの拡張子に一致するすべてのファイルが返されます。


5
あなたの例を使用して構文エラーが発生しました??? 'bash:予期しないトークン `('に近い構文エラー
nagordon

2
そうだねls *.@(mp3|exe|mp4)shopt -s extglobこれが機能するために必要です。ちなみに、それlsも役に立たないので、あなたはただ行うことができますprintf '%s\n' *.@(mp3|exe|mp4)
gniourf_gniourf 2017年

1
macOS 10.13で予期しない構文のトークンメッセージが表示される
Chris

1
ls | grep "\.mp4$
\.mp3$
\.exe$"

ありがとうございますが、数行使用するのは少し不便です。
ミント

これmdfindにより、これまでで最高/最速の検索が実現します! mdfind -name querystring | grep "\.h$" ファイルタイトルにquesrystringが含まれるすべてのヘッダーを検索します。プロント。
Alex Grey

1

ls -R | findstr ".mp3"

ls -R =>サブディレクトリを再帰的にリストします


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.