PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dateiname im Skript ändern



oafish
16-05-2009, 12:12
Hallo,
bin gerade am fertigstellen eines Backupskriptes.
Nach dem fertigstellen enthält der Dateiname folgendes format:

Backup from Server ADs for domain xyz status ok

Nun möchte ich die Textdatei in ein anderes Verzeichnis kopieren und das Backup from entfernen.
Mein Skript sieht nun folgendermaßen aus:



for datei in $(ls -1 Backup*); do
mv $datei | $(echo "$datei" |sed s/Backup from//g)
done


Nun gibt mir die for Schleife jedes Wort separat aus.
Sieht dann so aus:
Backup
from
Server
ADs
...

Hm, hat jemand eine Ahnung warum dies so ist? Bin mir eigentlich sicher dieses vorgehen schon öfters gemacht zu haben. Wieso dies nun so ist, weiß das jemand?

ContainerDriver
16-05-2009, 12:58
Hallo,

bist du dir bei deinem mv-Befehl sicher? Irgendwie sieht der nämlich komisch aus (besonders die Pipe).
Der Befehl


mv "$datei" "$(echo $datei|sed 's/Backup from//g')"

würde das machen, was du in deinem Text beschreibst.

Gruß, Florian

jan61
17-05-2009, 19:06
Moin,

um eine for-Schleife für Dateinamen mit Leerzeichen verwenden zu können, musst Du IFS umsetzen, der trennt nämlich in seiner Standardeinstellung auch bei Leerzeichen. Die andere Variante ist stattdessen eine read-Schleife.

Siehe auch hier: http://www.jan-trippler.de/de/script_tipps/loops.html

Zu dem mv-Konstrukt hat ja ContainerDriver schon was geschrieben, den sed kannst Du Dir auch sparen, das kannst Du mit Shell-Mitteln lösen (spart Dir je Zeile einen extra Prozess):

jan@jack:~> F="Backup from file.txt"
jan@jack:~> echo ${F#Backup from }
file.txt
Deine Schleife könnte also so aussehen:

ls Backup* | while read f; do
mv "$f" "${f#Backup from }"
doneBeachte die "" um die Dateinamen - damit umgehst Du Fehler bei Dateien mit Leerzeichen.

Zum Nachlesen: "man bash", hier nach "Command Substitution" (das, was ContainerDriver gemeint hat) und "Parameter Expansion" suchen.

Jan