Ordner umbennenen

Peregrine

Peregrine

Honorarkonsul
Huhu!
:oldman Frage: ich möchte in einem Verzeichnis enhaltene Daten umbenamsen. Der Verzeichnisinhalt sieht z.B. wie folgt aus

Code:
drwxr-xr-x+ 11 augustm1        mkgroup-l-d 0 Sep 11 13:03 .
drwxrwx---+ 28 Administratoren SYSTEM      0 Sep 11 13:02 ..
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 1157972308
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 1157972309
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 1157972310
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 1157972311
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 1157972312
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 1157972313
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 1157972314
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 1157972315
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 1157972316

Ich möchte nun vor die Verzeichnisnamen Prefixe schreiben, damit die Ordnernamen danach so aussehen.

Code:
drwxr-xr-x+ 11 augustm1        mkgroup-l-d 0 Sep 11 13:03 .
drwxrwx---+ 28 Administratoren SYSTEM      0 Sep 11 13:02 ..
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 pre_1157972308
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 pre_1157972309
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 pre_1157972310
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 pre_1157972311
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 pre_1157972312
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 pre_1157972313
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 pre_1157972314
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 pre_1157972315
drwxr-xr-x+  2 augustm1        mkgroup-l-d 0 Sep 11 13:02 pre_1157972316

Bisher sieht mein Code so aus

Code:
find . -type d -name '*' -type d | xargs -i mv {} 'pre{}'

Logischerweise gibt es nun folgende Fehlermeldung

Code:
mv: cannot move `./1157972308' to `x./1157972308': No such file or directory
[...]

Wie bewerkstellige ich es, dass ich das "./" loswerde? Wie kann ich die Filenamen extrahieren? Muss ich da vorher noch durch einen anderen CMD pipen?
 
Peregrine schrieb:
...
Code:
find . -type d -name '*' -type d | xargs -i mv {} 'pre{}'

...

Damit kommt find logischerweise nicht klar. Besser wäre eine Umleitung in eine Variable:

Code:
find ... | while read i; do mv "$i" "pre_$i"; done

Gruss, Xanti
 
Xanti schrieb:
Damit kommt find logischerweise nicht klar. Besser wäre eine Umleitung in eine Variable:

Code:
find ... | while read i; do mv "$i" "pre_$i"; done

Gruss, Xanti

Das wird nicht funktionieren, wenn in $i der von find vorangestellte Pfad enthalten ist.
Wenn find /home/user/verzeichnisname liefert, dann wird daraus pre_/home/user/verzeichnisname
Also einfach Variablenexpansion der Bash/Ksh oder basename (wie bereits gesagt wurde) verwenden.
Mit Varaiblenexpansion wäre das :
Code:
find . -type d -maxdepth 1|while read i; do 
F=pre_${i##.*/};
P=${i%/.*};
 mv $i ${P}/$F;
  done
Das geht natürlich kompakter, soll aber hier verdeutlichen was passiert.

Gruß Wolfgang
 
Wolfgang schrieb:
Das wird nicht funktionieren, wenn in $i der von find vorangestellte Pfad enthalten ist.
Wenn find /home/user/verzeichnisname liefert, dann wird daraus pre_/home/user/verzeichnisname...

Doh, stimmt. Heute wieder zu heiss hier. ;)
 
Besten Dank an alle - ursprünglich habe ich auch den Befehl "Basename" gesucht und auch versucht das ganze so zu realisieren, aber es klappte nicht wirklich :-)

Ich hab das ganze nun so gelöst - scheint mir etwas lesbarer.
@Wolfgang: deine Lösung scheint mir sehr interessant - wenn möglich würde ich mich einen kurzen Kommentar deines Ansatzes bitten; wie funktioniert denn das?! :think:

Code:
find . -type d | while read i; 
do
if test $i == . -o $i == ..; then
continue;
else
 newfile=prefix_$(basename $i);
 mv $i $newfile;
fi;
done
 
Hallo

Parameterexpansion ist das Suchwort:
Hier einen Auszug aus der man bash:
${parameter#word}
${parameter##word}
The word is expanded to produce a pattern just as in pathname expansion. If the pattern matches the
beginning of the value of parameter, then the result of the expansion is the expanded value of parame-
ter with the shortest matching pattern (the ``#'' case) or the longest matching pattern (the ``##''
case) deleted. If parameter is @ or *, the pattern removal operation is applied to each positional
parameter in turn, and the expansion is the resultant list. If parameter is an array variable sub-
scripted with @ or *, the pattern removal operation is applied to each member of the array in turn, and
the expansion is the resultant list.

${parameter%word}
${parameter%%word}
The word is expanded to produce a pattern just as in pathname expansion. If the pattern matches a
trailing portion of the expanded value of parameter, then the result of the expansion is the expanded
value of parameter with the shortest matching pattern (the ``%'' case) or the longest matching pattern
(the ``%%'' case) deleted. If parameter is @ or *, the pattern removal operation is applied to each
positional parameter in turn, and the expansion is the resultant list. If parameter is an array vari-
able subscripted with @ or *, the pattern removal operation is applied to each member of the array in
turn, and the expansion is the resultant list.
Ich entferne also vorangestellten Pfad mit ${VAR##.*/}, weil das alles was nach dem letzten Slash folgt zurückgibt. Beliebig viele Zeichen beliebig oft werden dabei mit geschluckt.
Im Fall des Pfades ist es genau umgekehrt, d.h. ich untersuche den Variableninhalt vom Ende her.

Gruß Wolfgang
 
*Pling* Heute wieder etwas dazu gelernt :-) Danke Wolfgang!
 

Ähnliche Themen

Löschscript mit Logging

mv auf Samba-Share mit 'preserving permissions'

Kernel [unknown ASC/ASCQ]

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

CSV Datei mit sed manipulieren/optimieren/ergänzen

Zurück
Oben