Найти и переименовать рекурсивно в папках, подпапках и нескольких файлах
Я новичок в шеллскрипте и у меня возникли проблемы при попытке сделать то, что мне нужно...
Я хочу "оптимизировать" все мои *.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, и внутри у меня есть другие папки с большим количеством *.pngs, и я хочу запустить этот 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 и находкой в нем, а также с помощью находки в консоли, вызывающей сценарий... попытался также применить некоторые примеры, которые я нашел здесь, в стеке, но ничего... Возможно, потому что, поскольку я действительно не знаю, как эта работа я не могу применить это просто так. Надеюсь, вы можете помочь мне с этой проблемой.
Спасибо вам большое!
Редактировать: чтобы запустить скрипт, мне нужно перейти в 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