14

Как сказать «в скрипте bash» для всех файлов типа .png или.PNG?

Я пытаюсь :

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

но получаю синтаксическую ошибку.

3 ответа3

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

Вы также можете попробовать некоторые однострочные, такие как

находить . -имя "* .png" -exec ....

или же

находить . -имя "* .png" | xargs ....

редактировать
Смотрите также комментарий @ Yab ниже о рекурсии.

1

ls здесь почти бесполезен, но для записи вот синтаксис, более близкий к вашей попытке:

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

Заметки:

  • Я предполагаю, что вы хотите и заглавные и строчные картинки. Разделитель && будет означать обработку файлов PNG, только если существуют файлы PNG, что, вероятно, не имеет особого смысла.
  • у вас будут отображаться сообщения об ошибках, если ни один из файлов не найден.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .