Я новичок в shellscript и у меня возникли некоторые проблемы при попытке сделать то, что мне нужно...
Я хочу «оптимизировать» все мои изображения *.png и обнаружилэтотпоэтому я сделал bash, как там написано:
#!/bin/bash
pngnq -vf -s1 *.png
rename -nq8.png .png *-nq8*
optipng -o7 *.png
Что это делает:
pngnq -vf -s1 *.png
берет *png из примера Image.png и создает копию с именем Image-nq8.png, которая является оптимизированнойrename -nq8.png .png *-nq8*
преобразует Image-nq8.png в Image.png, так что у вас будет то же самое, что и раньше, но оптимизированное (чтобы в папках было то же самое, что и до оптимизации) <= ОЧЕНЬ ВАЖНО!optipng -o7 *.png
выполняет еще одну оптимизацию Images.png без создания копий.
Но теперь у меня возникла проблема:
Если я пишу в консоли каждую строку по порядку, то это работает нормально в папке, в которой я нахожусь, но теперь мне нужно сделать это автоматически и рекурсивно. Я объясняю свой случай:
примечание: я говорю папка как каталог
У меня есть папка с именем ImagesFolder, а внутри нее есть другие папки с другими файлами *.png, и я хочу запустить этот bash в каждой подпапке ImagesFolder, но я не знаю, как это сделать (как я уже сказал, я новичок в Unix, скриптах оболочки и т. д.), а то, что я нашел в интернете и попробовал, не сработало или было полной ерундой...
Чтобы лучше понять, у меня есть что-то вроде:
ImagesFolder
|-Folder1
| |- Folder12
| | |-20 images here
| |- Folder13
| | |- 10 images more here
| |- _Folder <- I have some folder names that start with '_'
| |- 5 images here
|-more images and folders and subfoldrs
Вот структура, и я хочу, чтобы скрипт запускался из ImagesFolder.
Я пробовал с for и find в нем, и с find в консоли, вызывая скрипт... пробовал также применить некоторые примеры, которые я нашел здесь в стеке, но ничего... Возможно, это потому, что я не знаю, как это работает, и я не могу применить это просто так. Надеюсь, вы сможете помочь мне с этой проблемой.
Большое спасибо!
Редактировать: Чтобы запустить скрипт, мне нужно перейти в ImageFolder, открыть консоль и ввести chmod u+x name_of_my_script
может ли это быть проблемой для запуска его в подпапках? Если да, можете ли вы сказать мне, как это исправить?
решение1
Скрипт bash:
Создайте новый файл find_and_rename
и добавьте следующие строки:
версия с
replace
#!/bin/bash shopt -s globstar for f in **/*png; do pngnq -vf -s1 "$f" # Uncomment the line below for a test run # rename -v -n 's/^(.*)\-nq8(.*)/$1$2/' "$f" # Comment the line below out for a test run rename -v 's/^(.*)\-nq8(.*)/$1$2/' "$f" optipng -o7 "$f" done
версия с
mv
#!/bin/bash shopt -s globstar for f in **/*png; do pngnq -vf -s1 "$f" # Uncomment the line below for a test run # echo "$f => ${f//-nq8/}" # Comment the line below out for a test run mv "$f" "${f//-nq8/}" optipng -o7 "$f" done
Сделайте файл исполняемым с помощью:
chmod +x find_and_rename
Зайдите в свою папку ImagesFolder
.
Запустите скрипт в этой папке.
<path_to_script>/find_and_rename
Пример (без pngnq
иoptipng
$ find . -type f -name "*.png"
./Image-nq8.png
./sub/Image-nq8.png
./Image2-nq8.png
$ ./find_and_rename
Image2-nq8.png renamed as Image2.png
Image-nq8.png renamed as Image.png
sub/Image-nq8.png renamed as sub/Image.png
$ find . -type f -name "*.png"
./Image2.png
./sub/Image.png
./Image.png