Rekursives Suchen und Umbenennen in Ordnern, Unterordnern und mehreren Dateien

Rekursives Suchen und Umbenennen in Ordnern, Unterordnern und mehreren Dateien

Ich habe keine Erfahrung mit Shellscript und habe einige Probleme, das zu tun, was ich brauche ...

Ich möchte alle meine *.png Bilder 'optimieren' und habe gefundenDasalso habe ich die Bash wie angegeben erstellt mit:

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

Dies bewirkt Folgendes:

  • pngnq -vf -s1 *.pngnimmt ein *png vom Beispiel Image.png und erstellt eine Kopie namens Image-nq8.png, die optimiert ist
  • rename -nq8.png .png *-nq8*macht aus Image-nq8.png Image.png, sodass Sie dasselbe wie vorher, aber optimiert haben (sodass Sie in den Ordnern dasselbe haben können wie vor der Optimierung) <= SEHR WICHTIG!
  • optipng -o7 *.pngführt eine weitere Optimierung an Images.png durch, ohne eine Kopie zu erstellen.

Aber jetzt habe ich ein Problem:

Wenn ich in der Konsole jede Zeile der Reihe nach schreibe, funktioniert es in dem Ordner, in dem ich mich befinde, einwandfrei, aber jetzt muss ich es automatisch und rekursiv tun. Ich erkläre meinen Fall:

Hinweis: Ich meine Ordner als Verzeichnis

Ich habe einen Ordner namens „ImagesFolder“ und darin weitere Ordner mit weiteren *.pngs. Ich möchte diese Bash in jedem Unterordner von „ImagesFolder“ ausführen, weiß aber nicht, wie das geht (wie gesagt, ich bin neu bei Unix und Shellscripts usw.) und was ich im Internet gefunden und versucht habe, hat nicht funktioniert oder war ein komplettes Durcheinander ...

Um es besser zu verstehen, habe ich so etwas:

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

Dies ist die Struktur und ich möchte, dass das Skript vom ImagesFolder aus ausgeführt wird.

Ich habe es mit einem „for“ und einem „find“ darin versucht und mit einem „find“ in der Konsole, das das Skript aufruft ... habe auch versucht, einige Beispiele anzuwenden, die ich hier im Stapel gefunden habe, aber nichts ... Wahrscheinlich liegt es daran, dass ich nicht wirklich weiß, wie das funktioniert, und es nicht einfach so anwenden kann. Ich hoffe, Sie können mir bei diesem Problem helfen.

Vielen Dank!

Bearbeiten: Um das Skript auszuführen, muss ich zu ImageFolder gehen, eine Konsole öffnen und eingeben: „ chmod u+x name_of_my_scriptKönnte es ein Problem sein, es in den Unterordnern auszuführen?“ Wenn ja, können Sie mir sagen, wie ich das Problem beheben kann?

Antwort1

Ein Bash-Skript:

Erstellen Sie eine neue Datei find_and_renameund fügen Sie die folgenden Zeilen hinzu:

  • Ausführung mitreplace

    #!/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
    
  • Ausführung mitmv

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

Machen Sie die Datei ausführbar mit:

chmod +x find_and_rename

Gehen Sie in Ihren Ordner ImagesFolder.

Starten Sie das Skript in diesem Ordner mit.

<path_to_script>/find_and_rename

Beispiel (ohne pngnqundoptipng

$ 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

verwandte Informationen