web-dev-qa-db-fra.com

Rechercher et renommer de manière récursive dans des dossiers, des sous-dossiers et plusieurs fichiers

Je suis nouveau avec shellscript et j'ai quelques problèmes à essayer de faire ce dont j'ai besoin ...

Je veux 'optimiser' toutes mes images * .png et j'ai trouvé this alors j'ai fait la bash comme il est dit avec:

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

Qu'est-ce que c'est?

  • pngnq -vf -s1 *.png prend un * png ofr exemple Image.png et recherche une copie nommée Image-nq8.png qui est celle optimisée.
  • rename -nq8.png .png *-nq8* fait que Image-nq8.png devienne Image.png afin que vous conserviez le même état qu'avant, mais optimisé (afin que vous puissiez avoir la même chose dans les dossiers qu'auparavant, optimiser) <= TRÈS IMPORTANT!
  • optipng -o7 *.png effectue une autre optimisation de Images.png sans effectuer de copie.

Mais maintenant j'ai un problème:

Si j'écris dans la console chaque ligne dans l'ordre, cela fonctionne bien sur le dossier que je suis mais maintenant je dois le faire automatiquement et récursif. J'explique mon cas:

note: je dis dossier comme un répertoire

J'ai un dossier nommé ImagesFolder et à l'intérieur, j'ai d'autres dossiers avec plus * .pngs et je veux exécuter cette bash dans chaque sous-dossier de ImagesFolder mais je ne sais pas comment le faire (comme je l'ai dit, je suis nouveau dans unix et shellscripts et cetera) et ce que j’ai trouvé sur Internet et que j’ai essayé ne fonctionnait pas ou était complètement en désordre ...

Pour mieux comprendre ce que j'ai, c'est quelque chose comme:

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

Ceci est la structure et je veux que le script soit exécuté à partir de ImagesFolder.

J'ai essayé avec un for et une trouvaille, et avec une trouvaille dans la console appelant le script ... essayé aussi d'appliquer quelques exemples trouvés ici dans la pile, mais rien ... C'est probablement parce que je ne sais pas vraiment comment ce travail, je ne peux pas l'appliquer comme ça. J'espère que vous pourrez m'aider avec ce problème.

Merci beaucoup!

Edit: Pour exécuter le script, je dois accéder à ImageFolder, ouvrir une console et mettre chmod u+x name_of_my_script pourrait-il y avoir un problème pour l'exécuter dans les sous-dossiers? Si oui, pouvez-vous me dire comment résoudre ce problème?

2
Megasa3

Un script bash:

Créez un nouveau fichier find_and_rename et ajoutez les lignes suivantes:

  • version avec 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
    
  • version avec 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
    

Rendre le fichier exécutable avec:

chmod +x find_and_rename

Allez dans votre dossier ImagesFolder.

Lancez le script dans ce dossier avec.

<path_to_script>/find_and_rename

Exemple (sans pngnq et 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
0
A.B.