PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : folder.jpg automatisch erstellenm recursiv suchen und ersetzen



Rogdab
15-05-2008, 19:29
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

jan61
15-05-2008, 23:04
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):

# 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
doneJan

Rogdab
16-05-2008, 06:38
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

jan61
16-05-2008, 19:08
Moin,

aha, dann isses klar - und auch viel einfacher ;-)

find . -type f \( -name '*.jpg' -o -name '*.png' -o -name '*.gif' \) -printf "mv '%p' '%h/folder.jpg'\n" | shDer 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?

Rogdab
17-05-2008, 08:35
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. :(

jan61
19-05-2008, 21:33
Moin,


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:

find . -type d -print0 | xargs -0 ls -aldSind 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

Rogdab
20-05-2008, 06:25
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

jan61
20-05-2008, 19:06
Moin,


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:
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:
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.