Archiv verlassen und diese Seite im Standarddesign anzeigen : Dateien nummerieren
Hallo,
ich habe einen Ordner mit Dateien, und eine Textdatei in der die Dateien in der gewünschten Reihenfolge stehen:
/Ordner/DateiameX
/Ordner/DateinameZ
/Ordner/DateinameY
Jetzt will ich die Dateien umbenennen in "NN <alterName>" wobei NN eine 2 stellige Nummer ist und <alterName> der alte Name. Die Nummern sollen sich nach der Reihenfolge der Dateien in der Textdatei richten (01,02,03,04...)
Ich wollte dafür ein Script schreiben (Hab auch meine script-Tuts durchgesucht) - hab es aber nicht geschafft - könnt ihr mir weiter helfen?
Script oder anderer Weg ist mir egal...
MfG,
Michi
musketaquid
13.12.06, 16:41
#!/bin/bash
OldDat=$(ls $1)
NN=0
for i in $OldDat
do
if [ $NN -le 9 ]
then
mv "$1$i" "$10$NN$i"
else
mv "$1$i" "$1$NN$i"
fi
NN=$(( $NN + 1 ))
done
Wenn du das Script z.B. "umbenennen" nennst, dann rufst du es so auf:
umbenennen /PfadZumOrdner
Sorry, aber ich glaube ich habe mich unklar ausgedrückt:
die Nummern sollen nicht einfach in der Reihenfolge wie ls sie liefert Nummeriert sein, sondern in der Reihenfolge in der sie in der Text Datei stehen.
Bsp:
vorhanden sind die Dateien: datei1.xx, datei2.xx, datei3.xx, datei4.xx, datei5.xx
in dem Ordner 'Ortner1'
In der text-datei steht:
Ortner1/datei1.xx
Ortner1/datei4.xx
Ortner1/datei3.xx
Ortner1/datei2.xx
Ortner1/datei5.xx
Also sollen die Dateien in: "01 datei1.xx", "02 datei4.xx", "03 datei3.xx"...
Danke trotzdem schon mahl!!!
Michi
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Keine Liste angegeben"
exit 1
fi
num=$(wc -l $1 | cut -d " " -f 1)
for i in $(seq 1 $num) ; do
line=$(sed -n ${i}p $1)
if ! [ -e "$line" ]; then
if [ ${#line} -eq 0 ]; then
echo "Fehler: Leerzeile in $1"
else
echo "Fehler: Datei $line existiert nicht"
fi
exit 1
fi
name=$(basename "$line")
path=${line%$name}
if [ $i -lt 10 ]; then
nn="0"$i
else
nn=$i
fi
newname=$nn" "$name
cmd="mv \"$path$name\" \"$path$newname\""
echo $cmd
# eval $cmd
done
Das Script erwartet als Parameter die Textdatei. Wenn die angezeigten Kommandos dem entsprechen, was du dir vorstellst, nimmst du in der Zeile '# eval $cmd' das Rautezeichen heraus und rufst das Script nochmal auf.
PS
Wenn du die Dateien auch händisch sortieren magst, empfehle ich dir krename.
Krename kann Dir helfen.
http://kde-apps.org/content/show.php?content=9876
Auch wenn schon andere Lösungswege gepostet wurden, passt die Ausgabe folgender Zeile so?
cat /Pfad/Zu/Datei | nl -nrz -w2 | awk '{printf ("\nmv %s %s_%s"), $2, $1, $2}'
OK, danke schon einmahl!
Ich habe das Script von 'buzz768' ausprobiert - leider funktioniert es nicht ganz:
*es kommt nicht mit Dateinamen die ein Leerzeichen haben zurecht
*die echo Ausgabe "Fehler: Datei $line existiert nicht" funktioniert aus irgendeinem Grund nicht
diese beiden kleinen Fehler konnte ich beheben:
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Keine Liste angegeben"
exit 1
fi
num=$(wc -l $1 | cut -d " " -f 1)
for i in $(seq 1 $num) ; do
line="$(sed -n ${i}p $1)"
if ! [ -e "$line" ]; then
if [ ${#line} -eq 0 ]; then
echo "Fehler: Leerzeile in $1"
else
echo "Datei nicht gefunden: $line"
fi
exit 1
fi
name=$(basename "$line")
path=${line%$name}
if [ $i -lt 10 ]; then
nn="0"$i
else
nn=$i
fi
newname=$nn" "$name
cmd="mv \"$path$name\" \"$path$newname\""
echo $cmd
# eval $cmd
done
aber,
*Es bringt "Datei nicht gefunden: ..." auch wenn die Datei vorhanden ist! Hat jemand eine Ahnung woran das liegt?
Danke,
Michi
Hier mein Konkurrenz-Senf *g*
Warum eigendlich das Leerzeichen nach der Zahl?
#!/bin/sh
if [ $# -eq 0 ]; then
echo "Keine Liste angegeben";
exit 1;
fi;
i=0;
cat "$1" | while read path; do
j=$i;
if [ $j -lt 10 ]; then j="0$j"; fi;
file="`basename "$path"`";
fol="${path%$file}";
newfile="$j $file";
newpath="$fol$newfile";
if test -e "$path"; then
mv -v "$path" "$newpath";
else
echo "Datei nicht gefunden: $path";
fi;
let i=$i+1;
done;
Edit: umständliche Pfad-Pfrimelei ersetzt durch buzz768's bessere Zeile ;)
*es kommt nicht mit Dateinamen die ein Leerzeichen haben zurecht
Hm, gerade das habe ich zu berücksichtigen versucht und hier auch mehrfach erfolgreich getestet...
*Es bringt "Datei nicht gefunden: ..." auch wenn die Datei vorhanden ist! Hat jemand eine Ahnung woran das liegt?
Kannst du die Fehlermeldung mal im Wortlaut posten? In der Textdatei muss der Pfad entweder relativ zum aktuellen oder als absoluter Pfad angegeben sein.
Hier mein Konkurrenz-Senf *g*
Dann darf ich aber auch nochmal ..eine Zeile sollte reichen ;) (das "echo" dient der Sicherheit und muss bei Bedarf entfernt werden)
cat /pafd/zu/datei | nl -nrz -w2 |sed 's/ /@XX@/g' | awk '{printf ("echo mv %s %s\\\\ %s\n"), $2, $1, $2}' | sed 's/@XX@/\\\\ /g' | sh
Respekt ;)
Das einzige Manko dürften Dateien in Unterverzeichnissen sein ;)
musketaquid
14.12.06, 15:39
Zitat von michiS
Sorry, aber ich glaube ich habe mich unklar ausgedrückt:
Sorry, ich glaub, ich hab nicht richtig gelesen. ;)
Aber zum Glück gibt's ja noch ein paar Leute, die das richtig machen!
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.