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

2

Sou novo em shellscript e estou com alguns problemas tentando fazer o que preciso ...

Eu quero "otimizar" todas as minhas imagens * .png e encontrei esta então fiz o bash como diz:

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

O que isto faz é:

  • pngnq -vf -s1 *.png pega um exemplo do Image.png e craeta uma cópia chamada Image-nq8.png que é a única otimizada
  • rename -nq8.png .png *-nq8* faz o Image-nq8.png tornar-se Image.png para que você tenha o mesmo de antes, mas otimizado (para que você possa ter o mesmo nas pastas que você tinha antes de otimizar) & lt; = MUITO IMPORTANTE!
  • optipng -o7 *.png faz outra otimização para Images.png sem fazer qualquer cópia.

Mas agora tenho um problema:

Se eu escrevo no console todas as linhas em ordem, funciona bem na pasta que estou, mas agora preciso fazer isso automaticamente e recursivo. Eu explico meu caso:

nota: eu digo pasta como um diretório

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

Para entender melhor, o que eu 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 eu quero que o script seja executado a partir do ImagesFolder.

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

Muito obrigado!

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

    
por Megasa3 04.06.2015 / 11:47

1 resposta

0

Um script bash:

Crie um novo arquivo find_and_rename e adicione as seguintes linhas:

  • versão com 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(.*)//' "$f"
    
        # Comment the line below out for a test run
        rename -v 's/^(.*)\-nq8(.*)//' "$f"
    
        optipng -o7 "$f"
    done
    
  • versão com 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
    

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 pngnq e 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
    
por A.B. 04.06.2015 / 12:14