現在のディレクトリからファイルを取得し、.mp4 .mp3 .exeファイルのみを出力したいだけです。だから私はこれを行うことができると思った:
ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$
しかし、いいえ、最初のgrepはmp4を出力するだけなので、他の2つのgrepは使用されません。
何か案は?PS、Slow Leopardでこのスクリプトを実行しています。
現在のディレクトリからファイルを取得し、.mp4 .mp3 .exeファイルのみを出力したいだけです。だから私はこれを行うことができると思った:
ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$
しかし、いいえ、最初のgrepはmp4を出力するだけなので、他の2つのgrepは使用されません。
何か案は?PS、Slow Leopardでこのスクリプトを実行しています。
回答:
何故なの:
ls *.{mp3,exe,mp4}
どこで学んだかはわかりませんが、これを使ってきました。
ls: *.exe: No such file or directory
例えば:ls *.{zip,tar.gz,tar} 2>/dev/null
で正規表現を使用する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)'
find . -iregex '.*\(mp3\|mp4\|exe\)'
mysupermp3.jpg
追加することを検討してください$
\\.
egrep
-拡張grep-ここで役立ちます
ls | egrep '\.mp4$|\.mp3$|\.exe$'
仕事をする必要があります。
ls
端末に(または-C
オプション付きで)複数列出力を生成します。ls
パイプへの(またはを使用した-1
)には、単一列の出力があります。(の出力をls
と比較しますls | cat
)。
最も簡単な方法は、lsを使用することです
ls *.mp4 *.mp3 *.exe
ls
なんらかのサイレントオプションがないことに驚いています。
grepは必要ありません。シェルのワイルドカードでうまくいきます。
ls *.mp4 *.mp3 *.exe
あなたが実行した場合
shopt -s nullglob
一致しないglobは完全に削除され、展開されていないコマンドラインには残りません。
大文字と小文字を区別しないグロビングが必要な場合(* .mp3はfoo.MP3と一致します):
shopt -s nocaseglob
-R
サブディレクトリ内の一致するファイルを一覧表示するオプションと一緒に使用しようとしていますが、このオプションは効果がないようで、現在のディレクトリの結果しか取得できません。
OSXユーザーの場合:
あなたが使用している場合ls *.{mp3,exe,mp4}
、それはエラーがスローされますそれらのいずれかの拡張子が何の結果を持っていない場合。
を使用ls *.(mp3|exe|mp4)
すると、いずれかの拡張子の結果が0の場合でも、それらの拡張子に一致するすべてのファイルが返されます。
ls *.@(mp3|exe|mp4)
。shopt -s extglob
これが機能するために必要です。ちなみに、それls
も役に立たないので、あなたはただ行うことができますprintf '%s\n' *.@(mp3|exe|mp4)
。
ls -R | findstr ".mp3"
ls -R
=>サブディレクトリを再帰的にリストします
ここに私のために働いた一例があります。
find <mainfolder path> -name '*myfiles.java' | xargs -n 1 basename
shopt -s nullglob
して参照してください*.exe *.mp3 *.mp4
。mywiki.wooledge.org/ParsingLs