В скрипте 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, либо проверку существования для всех совпадений файлов, как это, на случай, если совпадений нет.
for i in *.{png,PNG}
Вы также можете попробовать некоторые однострочные, такие как
или
Редактировать
Смотрите также комментарий @ Yab ниже о рекурсии.
источник
find -maxdepth 1 -iname "*.png"
ls
здесь почти бесполезен, но для записи вот синтаксис, более близкий к вашей попытке:Примечания:
источник