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 *.png
pega um *png do exemplo Image.png e cria uma cópia chamada Image-nq8.png que é a otimizadarename -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 *.png
faz 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_script
isso 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_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(.*)/$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 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
eoptipng
$ 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