Рекурсивный поиск и переименование в папках, подпапках и нескольких файлах

Рекурсивный поиск и переименование в папках, подпапках и нескольких файлах

Я новичок в 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

Связанный контент