Archiv verlassen und diese Seite im Standarddesign anzeigen : ein script durch mehrere Ordner wandern lassen
Moin,
ich habe mir ein script gebastelt das alle Bilder in einen Ordner resized und dann die Bilder anhand des Ordnernamens umbennent.
Nun würde ich gerne die optione hinzufügen das dieses script durch alle unterverzeichnisse wandelt und sich dann dort ausführt.
#!/bin/bash
#
#pfad=`pwd`
#Oname="$(echo $pfad| sed 's/.*\///' | sed 's/\///g')"
Oname="${PWD##*/}"
ls |while read datei1 ; do /usr/bin/convert -resize 640x480! "$datei1" _"$datei1" ; rm $datei1;done
i=1;
for file in *.png;
do
while [ -f "$Oname"_shot"$(printf "%03d" $i).png" ]
do
((i++))
done
mv $file "$Oname"_shot"$(printf "%03d" $i).png"
done
exit 0
Leider funktioniert das umbennen nur einmal, beim 2ten durchlaug stört es sich an evtl. Leerzeichen die im neuen Namen stehen.
Besten dank an die Autoren der Nummerierungsschleife hier im Forum.
peschmae
07-08-2005, 10:10
Wenn du so wenig wie möglich am Script ändern willst wäre das wohl was in der Art von
WD=$(pwd)
find -type d | while read dir; do
cd $dir
# hier dein Script
cd $WD
done
aber am besten basierst du wohl gleich das komplette Script auf find statt auf einer "for file in *.png"-Schleife - so in die Richtung von
find -type f -name "*.png" - exec tuzeugs {} \;
wobei hier {} von find jeweils durch einen der Dateinamen ersetzt wird, wenn tuzeugs ausgeführt wird.
Aber dann wird natürlich das Script tendentiell etwas anders, weil du dich wohl nicht in dem Ordner befindest, wo die PNGs sind...
MfG Peschmä
super, die erste methode funktioniert nach einer kleinen modifikation.
In die zweite kann ich mich grad noch nicht reindenken.
Leider bestehen noch probleme mit den Leerzeichen in den Dateinamen whärend des umbenenens im letzten abschnitt.
Wo genau müssen die Anführungszeichen hin?
Rein von der Logik her so:
""$Oname"_shot"$(printf "%03d" $i).png""
aber das funzt leider nicht.
#!/bin/bash
#
WD=$(pwd)
find -type d | while read dir; do
cd "$dir"
# ls *.png
# resize
Oname="${PWD##*/}"
ls |while read datei1 ; do /usr/bin/convert -resize 640x480! "$datei1" _"$datei1" ; rm $datei1;done
i=1;
# rename ordnername_shot00x
for file in *.png;
do
while [ -f "$Oname"_shot"$(printf "%03d" $i).png" ]
do
((i++))
done
mv $file "$Oname"_shot"$(printf "%03d" $i).png"
done
cd "$WD"
done
exit 0
peschmae
07-08-2005, 12:01
statt dem
""$Oname"_shot"$(printf "%03d" $i).png""
oder was auch immer sollte eigentlich das hier gehen:
"${Oname}_shot$(printf %03d $i).png"
In der Annahme dass die Variable da Oname ist - und nicht Oname_shot oder nur O ;)
MfG Peschmä
In der jetzigen Form läuft es wunderbar durch,
nur scheint es den convert befehl auch im root ausführen zu wollen:
convert: missing an image filename `_9 Lives'.
rm: Entfernen von „9 Lives“ nicht möglich: Ist ein Verzeichnis
mv: Aufruf von stat für „*.png“ nicht möglich: Datei oder Verzeichnis nicht gefunden
das script hängt dann einige minuten bis es sich beendet.
#!/bin/bash
#
# wechsel in die Ordner
WD=$(pwd)
find -type d | while read dir; do
cd "$dir"
# ls *.png
# resize
Oname="${PWD##*/}"
ls |while read datei1 ; do /usr/bin/convert -resize 640x480! "$datei1" _"$datei1" ; rm "$datei1"; done
i=1;
# rename ordnername_shot00x
for file in *.png;
do
while [ -f "${Oname}_shot$(printf %03d $i).png" ]
do
((i++))
done
mv "$file" "${Oname}_shot$(printf %03d $i).png"
done
cd "$WD"
done
exit 0
peschmae
07-08-2005, 14:47
Ich sehe das Problem gerade auch nicht.
Aber:
for file in *.png;
do
while [ -f "${Oname}_shot$(printf %03d $i).png" ]
do
((i++))
done
mv "$file" "${Oname}_shot$(printf %03d $i).png"
done
könntest du doch auch abkürzen indem du das Zählen in die For-Schleife verschiebst (und falls so Dateien eventuell schon existieren, die while-Schleife *vor* die For-Schleife verlegst).
Dann müsste das while nicht für jede Datei durchgenudelt werden.
MfG Peschmä
Das Problem ist, dass im Resize-Teil "ls" auch Unterverzeichnisse auflistet, welche dann als Bilddateien behandelt werden.
Ersetze ls mal durch find . -type f -depth 0
peschmae
07-08-2005, 21:55
Ach so.
Eigentlich könntest du das ganze convert ja auch in der for f in *.png-Schleife machen, oder? Am besten gleich noch mit dem "richtigen" Dateinamen als Output-Filename.
MfG Peschmä
Ich hab das script mittlerweile dank eurer und der hilfe andere folgendermassen verändert.
Es erstellt jetzt thumbnails für die Bilder und verschieb sie in die passenden Ordner.
Leider kann mein php script nicht mit Leerzeichen umgehen!
Wie könnte ich diese script so abändern das es die dateinamen so erstellt das leerstellen durch unterstriche ersetzt werden?
Am sinnvollsten wär es woll ganz am anfang alle ordner umzubennen.
#!/bin/bash
#
# wechsel in die Ordner
WD=$(pwd)
find -type d | while read dir; do
cd "$dir"
# ls *.png
# resize
Oname="${PWD##*/}"
i=1;
for file in *.png;
do
filename="$Oname""_shot""$(printf "%03d" $i)"".png"
mkdir thumbnails
mkdir shots
mv "$file" tmp_"$file"
/usr/bin/convert -size 240x160 tmp_"$file" -resize 240x160! -type Palette -colors 128 +profile "*" "thumbnails/$filename"
/usr/bin/convert -resize 480x320! -type Palette -colors 128 tmp_"$file" "shots/$filename"
rm tmp_"$filename"
#mv tmp_"$file" shots/"$filename"
#mv "$file" "$filename"
((i++))
done
cd "$WD"
done
exit 0
danke
PS: Ich überlege gerade das es sinnvoller wäre die Dateinamen temporär in php umzubenennen, damit die original namen beibehalten werden
Wie könnte ich diese script so abändern das es die dateinamen so erstellt das leerstellen durch unterstriche ersetzt werden?
filename=${filename// /_}Beachte dir doppelten /
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.