Busque y cambie el nombre de forma recursiva en carpetas, subcarpetas y varios archivos

Busque y cambie el nombre de forma recursiva en carpetas, subcarpetas y varios archivos

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 *.pngtoma un *png de ejemplo Image.png y crea una copia llamada Image-nq8.png que es la optimizada
  • rename -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 *.pnghace 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_renamey agregue las siguientes líneas:

  • versión conreplace

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

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

$ 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

información relacionada