Encontre e renomeie recursivamente em pastas, subpastas e vários arquivos

Encontre e renomeie recursivamente em pastas, subpastas e vários arquivos

Sou novo em shellscript e estou tendo alguns problemas ao tentar fazer o que preciso...

Quero 'otimizar' todas as minhas imagens *.png e encontreiesseentão fiz o bash como diz:

#!/bin/bash    
 pngnq -vf -s1 *.png    
 rename -nq8.png .png *-nq8*     
 optipng -o7 *.png

O que isso faz é:

  • pngnq -vf -s1 *.pngpega um *png do exemplo Image.png e cria uma cópia chamada Image-nq8.png que é a otimizada
  • rename -nq8.png .png *-nq8*faz com que Image-nq8.png se torne Image.png para que você tenha o mesmo de antes, mas otimizado (para que você possa ter o mesmo nas pastas que tinha antes de otimizar) <= MUITO IMPORTANTE!
  • optipng -o7 *.pngfaz outra otimização para Images.png sem fazer nenhuma cópia.

Mas agora estou com um problema:

Se eu escrever no console todas as linhas em ordem, funciona bem na pasta que estou, mas agora preciso fazer isso de forma automática e recursiva. Eu explico meu caso:

nota: eu digo pasta como um diretório

Eu tenho uma pasta chamada ImagesFolder e dentro dela tenho outras pastas com mais *.pngs e quero rodar esse bash em todas as subpastas de ImagesFolder mas não sei como fazer (como disse sou novo em unix e shellscripts e assim por diante) e o que encontrei na internet e tentei não funcionou ou foi uma bagunça completa...

Para entender melhor o que tenho é algo como:

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

Esta é a estrutura e quero que o script seja executado em ImagesFolder.

Eu tentei com um for e um find nele, e com um find no console chamando o script... tentei também aplicar alguns exemplos que encontrei aqui na pilha mas nada... Provavelmente é porque como eu realmente não sei como funciona este trabalho não posso aplicá-lo assim. Espero que você possa me ajudar com esse problema.

Muito obrigado!

Editar: Para executar o script eu tenho que ir ao ImageFolder, abrir um console e colocar chmod u+x name_of_my_scriptisso poderia ser um problema para executá-lo nas subpastas? Se sim, você pode me dizer como consertar isso?

Responder1

Um script bash:

Crie um novo arquivo find_and_renamee adicione as seguintes linhas:

  • versão comreplace

    #!/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
    
  • versão commv

    #!/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
    

Torne o arquivo executável com:

chmod +x find_and_rename

Entre na sua pasta ImagesFolder.

Inicie o script nesta pasta com.

<path_to_script>/find_and_rename

Exemplo (sem pngnqeoptipng

$ 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

informação relacionada