Как сказать «в скрипте bash» для всех файлов типа .png или.PNG?
Я пытаюсь :
for i in (`ls *.PNG` && `ls *.png`)
но получаю синтаксическую ошибку.
Как сказать «в скрипте bash» для всех файлов типа .png или.PNG?
Я пытаюсь :
for i in (`ls *.PNG` && `ls *.png`)
но получаю синтаксическую ошибку.
Если вы хотите все возможные комбинации, используйте:
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, либо проверку существования для всех совпадений файлов, как это, на случай, если совпадений нет.
Вы также можете попробовать некоторые однострочные, такие как
находить . -имя "* .png" -exec ....
или же
находить . -имя "* .png" | xargs ....
редактировать
Смотрите также комментарий @ Yab ниже о рекурсии.
ls
здесь почти бесполезен, но для записи вот синтаксис, более близкий к вашей попытке:
for i in $(ls *.PNG ; ls *.png)
Заметки: