Die drei aktuellsten Dateien kopieren

L

lalyboy

Grünschnabel
Hallo Zusammen

Ich suche ein Weg wie ich die letzen 3 Dateien kopieren kann. Ich habe schon viel gegoogelt, aber noch kein geeignetes Skript gefunden.

Ich würde gerne die drei aktuellsten Logdateien von einer DB kopierung und auf einem anderen Verzeichnis speichern. Es werden die Log nach einer fortlaufenden Nummer generiert. Vielleicht weiss jemand ein Befehl oder Parameter, wie man die letzen drei Datein auflisten oder kopieren kann? :hilfe2:

Im Verzeichnis /sapdb/backup werden regelmässig die Logs auf Files geschrieben.

-rw-rw---- 1 sqdvrp sapsys 231473152 Jun 1 12:00 log1.220
-rw-rw---- 1 sqdvrp sapsys 217645056 Jun 2 12:01 log1.221
-rw-rw---- 1 sqdvrp sapsys 175112192 Jun 3 12:00 log1.222
...
...
...
-rw-rw---- 1 sqdvrp sapsys 819396608 Jul 25 20:41 log1.242
-rw-rw---- 1 sqdvrp sapsys 819396608 Jul 27 11:11 log1.243
-rw-rw---- 1 sqdvrp sapsys 819396608 Aug 2 19:27 log1.244

Freundliche Grüsse

0.B
 
Also ich würde es so machen:
Code:
#!/bin/bash
count=0
for i in `ls`
do 
   count=$count+1 
   files[$count]=$i 
done; 
for ((i=count-2; i <= count; i++))
do 
   echo ${files[i]}
done;
 
Hallo
Immer die drei neusten Dateien nach der ctime liefert dir auch folgender Einzeiler.
cd /quelle;for i in $(ls -A1t log* |tail -n3); do echo $i;done
copieren dann halt ensprechend
cd /quelle;for i in $(ls -A1t log* |tail -n3); do cp $i /zielpath/$i ;done
die drei ältesten gleich löschen
cd /quelle;for i in $(ls -A1tr log* |tail -n3); do rm -f $i;done

Gruß Wolfgang
 
Vielen Dank

Für Eure Tipps. :)

Habe nun ein Funktionsfähiges Script, dass über cron gestartet wird.
 
Also ich habe das Skript von MrFenix genommen und ein wenig angepasst. Mittels Cronjob wird das Skript jeden Tag einmal ausgeführt.

Für meinen Bedarf reicht es.
Es wäre nur interessant zu sehen, wie das Skript das Ziel mit der Quelle vergleichen könnte, um zu sehen ob es alte Files im Zielverzichnis löschen muss und/oder neue kopieren soll.

Code:
#!/bin/bash

source=/xxx/backup
destination=/yyy/backup
cd $source

rm $destination/log1.*

count=0
for i in `ls`
do
   count=$count+1
   files[$count]=$i
done;
for ((i=count-1; i <= count; i++))
do
   cp -v ${files[i]} $destination/${files[i]}
done;
 
Hallo
Mal abgesehen davon, dass du damit nur die letzte statt der letzten drei Dateien kopierst, ist es viel einfacher mit rsync zu arbeiten.
Wenn beide Verzeichnisse immer gleich sein sollen, findet rsync nämlich selber raus, was abgeglichen werden soll und kopiert nur die neu hinzugekommenen Dateien.
Damit ersparst du dir die ganzen Schleifen. Dein /source kann so aber überlaufen.
Deshalb würde ich das per cronjob so machen.
erst die Dateien die z.B. älter als 5 Tage im Quellverzeichnis sind finden und löschen:

#!/bin/bash

source=/xxx/backup/
destination=/yyy/backup
cd $source
find . -type f -name "log.*" -ctime +5 -exec rm -f {} \;
#nun abgleichen mit rsync
rsync --delete -avR $source $destination
# damit hast du was du willst

Die -ctime +5 kannst du dir anpassen wie du willst.
Brauchst dich also um das Zielverzeichnis nicht mehr kümmern, das macht rsync --delete für dich.
;)
Gruß Wolfgang
EDIT rm die Option -f dazu, sonst läuft es uU. nicht 8)
 
Zuletzt bearbeitet:

Ähnliche Themen

Bestimmte Dateien aus vielen Unterordnern löschen

Mein Server versendet SPAM in Massen

xrandr: cant open display

CSV Datei mit sed manipulieren/optimieren/ergänzen

Rechte beim Anlegen von Dateien via Samba-Client nicht korrekt gesetzt

Zurück
Oben