it-swarm-ja.com

Bashシェル:タイプ.pngまたは.PNGのすべてのファイルを一覧表示しますか?

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

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

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

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

14
simon

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

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または存在チェックのいずれかを使用することをお勧めします。

18
Gordon Davisson

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

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

または

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

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

5
Alain Pannetier

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

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

ノート:

  • 大文字と小文字の両方の画像が必要だと思います。 &&セパレータは、PNGファイルが存在する場合にのみpngファイルを処理することを意味しますが、これはおそらくあまり意味がありません。
  • どちらのパターンのファイルも見つからない場合は、エラーメッセージが表示されます。
1
jlliagre