Bashシェル:.pngまたは.PNGタイプのすべてのファイルをリストしますか?


14

bashスクリプトで、「。pngまたは.PNGタイプのすべてのファイルに対して」と言うにはどうすればよいですか?

私はしようとしています :

for i in (`ls *.PNG` && `ls *.png`)

しかし、構文エラーが発生します。

回答:


18

可能なすべての組み合わせが必要な場合は、次を使用します。

for i in *.[Pp][Nn][Gg]; do

または

shopt -s nocaseglob
for i in *.png; do

ただし、スクリプトを実行するまで、スクリプトのすべてのシェルグロブ(ワイルドカードファイルの一致)の大文字と小文字を区別しませんshopt -u nocaseglob

本当に.PNGと.pngだけが必要な場合(たとえば、.PnGや.pnGは不要)、次のいずれかを使用します。

shopt -s nullglob
for i in *.png *.PNG; do

または

for i in *.png *.PNG; do
    [[ -e "$i" ]] || continue

... nullglobまたは存在チェックの理由は、小文字のみまたは大文字のみの拡張子がある場合、ファイルのリストに一致しないパターンが含まれるため、ループの本文でエラーが発生するためです。nocaseglobの場合と同様に、後でnullglobシェルオプションをオフにしたい場合があります(ただし、私の経験では、nullglobをオンにしておくと、特にスクリプトで有効な場合がよくあります)。実際、このようなすべてのファイルの一致に対してnocaseglobまたは存在チェックのいずれかを使用することをお勧めします。一致がない場合に備えて。


5
for i in *.{png,PNG}
グレンジャックマン

@glenn:それも機能します( `* .png * .PNGと同等)。ただし、nullglobまたは存在チェックが必要です。
ゴードンデイヴィソン

5

次のようなワンライナーを試すこともできます

見つける。-iname "* .png" -exec ....

または

見つける。-iname "* .png" | xargs ....

編集
再帰については、以下の@Yabのコメントも参照してください。


1
ただし、findはデフォルトで再帰的であるため、質問が求めるのと同じ結果を得るには、やらなければなりません find -maxdepth 1 -iname "*.png"
Yab

@Yab、あなたは完全に正しいです。私はこの側面を見落としていました。
アランパネティエ

1

ls ここではほとんど役に立たないが、記録のためにあなたの試みに近い構文があります:

for i in $(ls *.PNG ; ls *.png)

ノート:

  • 大文字と小文字の両方の写真が必要だと思います。&&セパレーターは、PNGファイルが存在する場合にのみpngファイルを処理することを意味し、おそらくあまり意味がありません。
  • どちらのパターンのファイルも見つからない場合は、エラーメッセージが表示されます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.