Оболонка Bash: список усіх файлів типу .png або .PNG?


14

Як у баш-скрипті я можу сказати "для всіх файлів типу .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 -maxdepth 1 -iname "*.png"
Yab

@Yab, ви абсолютно праві. Я не помітив цього аспекту.
Ален Паннетьє

1

ls тут майже марно, але для запису ось синтаксис, наближений до вашої спроби:

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

Примітки:

  • Я припускаю, що ви хочете і великих, і малих зображень. Розділювач && означатиме обробляти png-файли лише за наявності файлів PNG, що, ймовірно, не має особливого сенсу.
  • у вас з’являться повідомлення про помилки, якщо не знайдено жодного файлу з будь-яким шаблоном.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.