Dateien verschieben + Zeitstempel anhängen mit Hilfe einer for - Schleife

A

Akasabi

Grünschnabel
Guten morgen zusammen,

könnt ihr mir bitte sagen warum meine for - Schleife nicht funktioniert?

Code:
timestamp=$( date +%d.%m.%y_%H:%M:%S )

for file in 'ls -lrt *00.txt | awk '{print $9}''
do
    echo $file
    mv $file /archive_aktuell/$file_$timestamp

done

Mit dieser for - Schleife möchte ich alle Dateien aus einem Verzeichniss, die die Endung *00.txt haben, in ein Archiv kopieren und dabei einen Zeitstempel anhängen.

Ist die Struktur meines mv - Befehls falsch oder gibt es bei einer Schleife eine Besonderheit, die ich beachten muss?

Über verschiedene Lösungsansätze würde ich mich freuen ;)

Danke im Voraus!

Gruß Akasabi
 
Die aeusseren Hochkommate sollten 'backticks' sein, d.h.
Code:
 `...`
oder (das ist sauberer)
Code:
 $(...)
. Die bash sieht
Code:
'ls -lrt *00.txt | awk '
und
Code:
{print $9}''
.
Du kannst auch ohne awk auskommen:
Code:
for i in $( /bin/ls *00.txt ); do echo ${i}; done
 
Danke für die Antwort und entschuldige meine späte Reaktion ;)

Das sind Beispieldateien die ich mit meiner for - Schleife verschieben und gleichzeitig umbennen möchte (Zeitstempel anhängen)

-rw------- 1 root root 0 Mar 6 08:59 testdatei_2425266200.txt
-rw------- 1 root root 0 Mar 6 08:59 testdatei_2925266200.txt

Und diese Fehlermeldung tritt bisher auf...wie ich mir schon gedacht habe ist mein mv - Befehl falsch aber ich komm einfach nicht darauf wie ich diesen verändern muss -.-

testdatei_2425266200.txt
mv: cannot rename testdatei_2425266200.txt to /archive_aktuell/06.03.13_08:59:40: No such file or directory
testdatei_2925266200.txt
mv: cannot rename testdatei_2925266200.txt to /archive_aktuell/06.03.13_08:59:40: No such file or directory


Meine for - Schleife sieht nun so aus:

Code:
timestamp=$( date +%d.%m.%y_%H:%M:%S )

for file in $(ls -lrt *00.txt | awk '{print $9}')
do
    echo $file
    mv $file /archive_aktuell/$file_$timestamp

done

Kann mir jemand bitte sagen was mein Fehler ist? Ich mach da schon eine Weile rum aber komm einfach nicht dahinter^^
 
Ich nehme an, dass der absolute Pfad /archive_aktuell/ nicht existiert.
Code:
ls /archive_aktuell/
 
Oh ja...kleiner Flüchtigkeitsfehler :D

Code:
mv $file archive_aktuell/$file_$timestamp

So sollte es natürlich heißen.

Mein Problem ist nun, dass das Verschieben und Umbennen nur teilweise funtkioniert:

/data/tmp/uebung/archive_aktuell

-rw------- 1 root root 0 Mar 6 08:59 06.03.13_11:40:41

Es wurde nur eine Datei verschoben und wie man sehen kann heißt diese Datei nur $timestamp anstatt von $file_$timestamp

Kann mir das jemand erklären? Soweit ich weiß müsste meine for - Schleife laufen bis $(ls -lrt *00.txt | awk '{print $9}') keine Dateien mehr ausgibt (sprich alle Dateien auf die das zutrifft wurden verschoben) oder nicht?

PS: Ich befinde mich im Verzeichniss /data/tmp/uebung wenn ich meine for - Schleife ausführe, also ein weiterer Verzeichniss - Fehler schließe ich aus!
 
Scheinen Leerzeichen zu sein, die stören. Benutze mal konsequent Doublequotes:
Code:
mv "$file" "archive_aktuell/$file_$timestamp"
 
Gar keine Probleme mit Sonderzeichen gibt es so:
Code:
timestamp=$( date +%d.%m.%y_%H:%M:%S )
find -maxdepth 1 -type f -name "*00.txt" -exec mv {} archive_aktuell/{}_$timestamp \;
 
Scheinen Leerzeichen zu sein, die stören. Benutze mal konsequent Doublequotes:
Code:
mv "$file" "archive_aktuell/$file_$timestamp"
Oder fehlende Klammern - der Dateiname enthaelt nur einen Unterstich, den vom timestamp, d.h., die bash interpretiert 'file_' als Variablenname. ${file}_${timestamp} sollte da weiterhelfen - oder eben Sproedes Vorschlag ueber 'find'.
 
tgruene hat recht:
Code:
~> t1=aaa
~> t2=bbb
~> echo $t1_$t2
bbb
Also klammern:
Code:
~> echo ${t1}_$t2
aaa_bbb
 
So ich konnte ds Problem endlich dank eurer Hilfe lösen :)

Der Vorschlag von tgruene hat funktioniert und die ausführliche Ekrlärung von Spröde war auch gut!

Meine for - Schleife sieht nun wie folgt aus:

Code:
timestamp=$( date +%d.%m.%y_%H:%M:%S )

for file in $(ls -lrt *00.txt | awk '{print $9}')
do
    echo $file
    mv "$file" "archive_aktuell/${file}_${timestamp}"

done


Ich hatte leider keine Zeit den find - Befehl auszuprobieren aber das werde ich demnächst nachholen ;)

Gruß Akasabi
 
Find ist ein sehr mächtiges Werkzeug, das man unbedingt kennen sollte, wenn man viel mit/an Dateien arbeitet.
 

Ähnliche Themen

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

rsync: Quelle größer als Ziel => "Archiv" aufteilen/splitten

Zurück
Oben