Bash kabuğu: .png veya .PNG?


14

Bir bash komut dosyasında '.png veya .PNG türündeki tüm dosyalar için' nasıl söyleyebilirim?

Deniyorum :

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

ancak bir sözdizimi hatası alıyorum.

Yanıtlar:


18

Tüm olası kombinasyonları istiyorsanız, şunu kullanın:

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

veya

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

ancak bu, komut dosyanızın tüm kabuk glob'larını (yani joker dosya eşleşmeleri) siz çalışana kadar duyarsız hale getirecektir shopt -u nocaseglob.

Gerçekten sadece .PNG ve .png (ve örneğin .PnG veya .pnG) istemiyorsanız,

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

veya

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

... nullglob veya varlık denetiminin nedeni, yalnızca küçük harfli veya yalnızca büyük harfli uzantılarınız varsa, dosya listesinde benzersiz kalıbı içereceğinden, döngü gövdesinde bir hataya neden olur. Nocaseglob ile olduğu gibi, nullglob kabuk seçeneğini daha sonra kapatmak isteyebilirsiniz (nullglob'a sahip olmak benim deneyimimde, özellikle bir komut dosyasında genellikle iyidir). Aslında, nocaseglob veya böyle bir dosya eşleşmesi için varoluş kontrolünü kullanmanın iyi bir fikir olduğunu düşünürüm, eşleşme olmaması durumunda.


5
for i in *.{png,PNG}
glenn jackman

@glenn: Yine de nullglob veya varlık denetimine ihtiyacınız olmasına rağmen, bu da işe yarar (* .png * .PNG'ye eşdeğer).
Gordon Davisson

5

Ayrıca bazı tek astarları da deneyebilirsiniz.

bulmak. -iname "* .png" -exec ....

veya

bulmak. -iname "* .png" | xargs ....

Düzenle
Ayrıca @ Yab'in özyineleme hakkındaki yorumuna da bakınız.


1
find varsayılan olarak özyinelemeli, bu yüzden sorunun sorduğu aynı sonucu elde etmek için yapmanız gerekir find -maxdepth 1 -iname "*.png"
Yab

@Yab, tamamen haklısın. Bu yönü göz ardı ettim.
Alain Pannetier

1

ls burada neredeyse işe yaramaz, ancak buradaki kayıt için girişiminize daha yakın bir sözdizimi:

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

Notlar:

  • Hem büyük hem de küçük resimler istediğinizi varsayıyorum. && separator, PNG dosyalarını yalnızca PNG dosyaları varsa işlemek anlamına gelir; bu muhtemelen pek mantıklı değildir.
  • her iki desenden herhangi bir dosya bulunmazsa hata mesajlarını görebilirsiniz.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.