Soy nuevo con Shellscript y tengo algunos problemas al intentar hacer lo que necesito...
Quiero 'optimizar' todas mis imágenes *.png y encontradasesteasí que hice el bash como dice con:
#!/bin/bash
pngnq -vf -s1 *.png
rename -nq8.png .png *-nq8*
optipng -o7 *.png
Lo que esto hace es:
pngnq -vf -s1 *.png
toma un *png de ejemplo Image.png y crea una copia llamada Image-nq8.png que es la optimizadarename -nq8.png .png *-nq8*
hace que Image-nq8.png se convierta en Image.png para que tengas lo mismo que antes pero optimizado (para que puedas tener lo mismo en las carpetas que tenías antes de optimizar) <= ¡MUY IMPORTANTE!optipng -o7 *.png
hace otra optimización de Images.png sin realizar ninguna copia.
Pero ahora tengo un problema:
Si escribo en la consola cada línea en orden, funciona bien en la carpeta en la que estoy, pero ahora necesito hacerlo de forma automática y recursiva. Te explico mi caso:
nota: digo carpeta como directorio
Tengo una carpeta llamada ImagesFolder y dentro tengo otras carpetas con más *.pngs y quiero ejecutar este bash en cada subcarpeta de ImagesFolder pero no sé cómo hacerlo (como dije, soy nuevo en Unix y shellscripts, etc.) y lo que encontré en Internet y probé no funcionó o fue un completo desastre...
Para entenderlo mejor lo que tengo es 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 es la estructura y quiero que el script se ejecute desde ImagesFolder.
Intenté con un for y un find en él, y con un find en la consola llamando al script... también intenté aplicar algunos ejemplos que encontré aquí en la pila, pero nada... Probablemente sea porque no sé realmente cómo funciona. este trabajo no lo puedo aplicar así sin más. Espero que puedas ayudarme con este problema.
¡Muchas gracias!
Editar: para ejecutar el script, tengo que ir a ImageFolder, abrir una consola y poner chmod u+x name_of_my_script
¿podría ser un problema ejecutarlo en las subcarpetas? En caso afirmativo, ¿puedes decirme cómo solucionarlo?
Respuesta1
Un script bash:
Cree un nuevo archivo find_and_rename
y agregue las siguientes líneas:
versión con
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
versión con
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
Haga el archivo ejecutable con:
chmod +x find_and_rename
Vaya a su carpeta ImagesFolder
.
Inicie el script en esta carpeta con.
<path_to_script>/find_and_rename
Ejemplo (sin pngnq
yoptipng
$ 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