Anzeige:
Ergebnis 1 bis 8 von 8

Thema: folder.jpg automatisch erstellenm recursiv suchen und ersetzen

  1. #1
    Registrierter Benutzer
    Registriert seit
    12.08.2006
    Beiträge
    33

    folder.jpg automatisch erstellenm recursiv suchen und ersetzen

    HAllo,
    ich versuche gerade ein script zu bauen das mir alle bilder sucht und diese dann in folder.jpg umbenennt. Ich möchte das artwork für meine ipod vorbereiten.
    es sollen alle png,gif, jpg ind folder.jpg umbenannt werden, da gtkpod nur diesen
    dateiname importiert.

    hier meine beiden ansätze, wie kann ich den find dazubringen nicht den ganzen
    pfag auszugeben?

    for dir in `find -type d`; do cd $dir; ls *.png ;done
    for cover in `find -name *.png`; do echo $cover ;done

    vielen dank

  2. #2
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    so ganz werde ich nicht schlau aus Deinem Posting. Alle Bilder sollen nach dem Lauf JPEGs sein und als Dateinamen den Namen des Verzeichnis haben? Zuerst mal: Wenn Du PNG-Dateien in JPG umbenennst, werden daraus noch längst keine JPEGs. Du musst sie konvertieren, z. B. mit convert: convert bla.png blubb.jpg. Und wenn Du das rekursiv über einen ganzen Verzeichnisbaum machen willst, dann kannst Du z. B. eine Schleife benutzen (ungetestet):
    Code:
    # zuerst mal alle .png, .jpg, .gif aufspueren
    find . -type f \( -name '*.jpg' -o -name '*.png' -o -name '*.gif' \) -print | while read fname; do
      # Verzeichnisnamen ermitteln, viele "-Quotings wegen moeglicher Leerzeichen
      dir="`basename \"\`dirname \\\"$fname\\\"\`\"`"
      # Basisverzeichnis ermitteln (alles vor dem letzten Verz.-Namen)
      base="`dirname \"\`dirname \\\"$fname\\\"\`\"`"
      # Dateiendung ermitteln (per sed alles weg bis zum letzten .)
      suffix="`echo \"$fname\" | sed 's/.*[^.]\.//'`"
      # JPG's nur umbenennen
      if test "$suffix" = "jpg"; then
        mv "$fname" "$base/$dir/${dir}.jpg"
      # andere Typen konvertieren
      else
        convert "$fname" "$base/$dir/${dir}.jpg"
      fi
    done
    Jan

  3. #3
    Registrierter Benutzer
    Registriert seit
    12.08.2006
    Beiträge
    33
    Hallo Jan,

    die dateien sollen dann den namen "folder.jpg" wobei folder nicht der Verzeichnissname ist sondern ein eigenname. Viele tools nehmen dann diese datei als Bild/Icon für diesen Ordner.
    Die dateien müssen nicht umbedingt umgewandelt werden, das dient nur als eselsbrücke, da
    gtkpod auch png importiert die mit jpg enden. etwas unschön aber geht

  4. #4
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    aha, dann isses klar - und auch viel einfacher ;-)
    Code:
    find . -type f \( -name '*.jpg' -o -name '*.png' -o -name '*.gif' \) -printf "mv '%p' '%h/folder.jpg'\n" | sh
    Der find sucht rekursiv alle Dateien mit den Endungen .jpg, .png und .gif und baut dann mit Hilfe des -printf den Befehl zum Umbenennen auf. Dieser wird zeilenweise an die Shell verfüttert. Wenn Du Dir angucken willst, was der find erzeugt, dann lass erstmal die Pipe und den Shellaufruf weg.

    Jan

    EDIT: funktioniert aber nur mit dem GNU-find. Reicht Dir das?
    Geändert von jan61 (16-05-2008 um 19:20 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    12.08.2006
    Beiträge
    33
    ich hab hier eh nur eine Ubuntu, das sollte gehen.
    Das script ist fast super, leider bearbeitet er nicht alle subfolders,
    kann das an sonderzeichen wie (, [ und ),] liegen? kann man da noch was machen,
    du hast ja schon alles und ' gepackt, reicht leider noch nicht.

  6. #6
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von Rogdab Beitrag anzeigen
    Das script ist fast super, leider bearbeitet er nicht alle subfolders,
    kann das an sonderzeichen wie (, [ und ),] liegen? kann man da noch was machen,
    du hast ja schon alles und ' gepackt, reicht leider noch nicht.
    diese Zeichen sollten eigentlich keine Rolle spielen (in einfachen Hochkommas wird eigentlich so gut wie nix mehr interpretiert), höchstens Zeilenumbruch oder einfaches Hochkomma könnten stören. Und natürlich ein . am Beginn des Dateinamens (wird durch den * nicht erfasst). Pack Dir die Ausgabe des find und seine Fehlermeldungen mal in 2 Dateien und durchsuche sie nach diesen verdächtigen Foldern. Vielleicht hast Du noch ein Problem mit Groß-/Kleinschreibung? Dann nimm statt -name die Option -iname - die arbeitet case-insensitiv. Gegen den Punkt am Anfang könnten -regex oder -iregex helfen (also reguläre Ausdrücke).

    Wenn Du damit keinen Erfolg hast, dann geht 2-stufig vor:
    1. Schicke den find erstmal so ab:
    Code:
    find . -type d -print0 | xargs -0 ls -ald
    Sind hier alle Unterverzeichnisse erfasst? Kommen Fehlermeldungen (unzureichende Rechte z. B.)? Hast Du in den Unterverzeichnissen Schreibrechte? Wenn nicht, geht der mv schief.

    2. Geh in ein Verzeichnis, in dem eine nicht erfasste Datei liegt, und schau Dir ganz genau an, wie der Dateiname (und die Zugriffsrechte) aussehen. Versuche ein "ls -liba ." - nicht dass es sich um symbolische Links handelt oder dass irgendwelche nichtdruckbaren Zeichen in den Dateinamen hängen.

    Jan

  7. #7
    Registrierter Benutzer
    Registriert seit
    12.08.2006
    Beiträge
    33
    Hallo,

    das ""find . -type d -print0 | xargs -0 ls -ald" zeigt mir alle Ordner an,
    auch die zeile mit dem mv, zwar nicht sortiert aber sollten alle drin sein.
    Die einzige Änderung die ich gemacht hab ist das ich jetzt doch alle Dateien
    mir dem original Dateityp/endung nehme.
    Folgende Fehlermeldung wird ausgespuckt:

    sh: Syntax error: "(" unexpected

    gruß

    boba

  8. #8
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von Rogdab Beitrag anzeigen
    Folgende Fehlermeldung wird ausgespuckt:
    sh: Syntax error: "(" unexpected
    kannst Du mal einen der Dateinamen hier posten? Normalerweise wird in Single Quotes nichts mehr interpretiert, also passiert es wahrscheinlich, dass irgendeine Kombination von ' und Sonderzeichen auftaucht - damit würde nämlich das Quoting des Dateinamens beendet und der Rest steht "nackt" da.

    Das ist ein kleines Problem, weil (man bash):
    Enclosing characters in single quotes preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.
    Wie man sieht, stimmt das:
    Code:
    jan@jack:~/tmp> echo '123'(456\('
    bash: syntax error near unexpected token `('
    jan@jack:~/tmp> echo '123\'(456\('
    bash: syntax error near unexpected token `('
    jan@jack:~/tmp> echo '123'"'"'(456\('
    123'(456\(
    So, die 3. Variante würde funktionieren - dann probieren wir mal was, wird jetzt allerdings etwas komplizierter. Für die folgende Umsetzung gibt es eine einzige Voraussetzung: In den Dateinamen dürfen keine "|" auftreten, wenn ja, dann musst Du Dir ein anderes Zeichen aussuchen (oder die betreffenden Dateien umbenennen) - ich habe zum Testen mal die Befehlszeile etwas verändert:
    Code:
    jan@jack:~/tmp/muell_namen> ls -l
    insgesamt 0
    -rw-r--r--  1 jan users 0 2008-05-20 19:50 123'(456\(b l a)
    -rw-r--r--  1 jan users 0 2008-05-20 19:50 123'(456\(bla)
    -rw-r--r--  1 jan users 0 2008-05-20 19:58 123 "buh" 456
    jan@jack:~/tmp/muell_namen> find . -type f -printf "ls |%p|; echo |%h/folder.jpg|\n" | sed "s/'/|\"'\"|/g;s/|/'/g" | sh
    ./123'(456\(bla)
    ./folder.jpg
    ./123'(456\(b l a)
    ./folder.jpg
    ./123 "buh" 456
    ./folder.jpg
    Jetzt schließen wir die Dateinamen erstmal in | ein, damit wir sie anschließend schön quoten können. Die Ausgabe des find wird an einen sed geschickt, der zuerst alle ' durch |"'"| ersetzt und dann die | durch ' - und das sollte dann sauber sein.

    Viel Erfolg
    Jan

    P.S.: In meiner Sammlung habe ich aber vorher mit solchen murksigen Dateinamen aufgeräumt - spart einem anschließend viel Ärger.

    EDIT: Der sed geht natürlich auch so, dass man gleich das ' durch '"'"' ersetzt - dann würde man der 2. Ersetzung etwas Arbeit ersparen.
    Geändert von jan61 (20-05-2008 um 19:44 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •