PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dateien nummerieren



michiS
13.12.06, 15:39
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

michiS
13.12.06, 16:51
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

buzz768
13.12.06, 17:06
#!/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.

Haase
13.12.06, 17:20
Krename kann Dir helfen.
http://kde-apps.org/content/show.php?content=9876

suck
13.12.06, 18:04
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}'

michiS
13.12.06, 21:38
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

3qualizer
13.12.06, 22:52
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 ;)

buzz768
13.12.06, 23:34
*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.

suck
13.12.06, 23:37
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

3qualizer
14.12.06, 09:23
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!