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

Я новичок в шеллскрипте и у меня возникли проблемы при попытке сделать то, что мне нужно...

Я хочу "оптимизировать" все мои *.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
Другие вопросы по тегам