Dateien nach Datum in ein Tar-Archiv packen?
Ich habe ein Verzeichnis mit vielen .jpg Dateien. Diese werden jede Minute von einer Webcam erzeugt.
Nun möchte ich ein Tar-Archiv erstellen, welches alle Dateien eines Tages enthält. Gleichzeitig sollen die Quelldateien gelöscht werden.
Danke!
3 Antworten
(ungetestet)
find . -name '*.jpg' -daystart -mtime 1 -maxdepth 0 -print0 | xargs -0 tar -xf archiv.tar
zum archivieren
find . -name '*.jpg' -daystart -mtime 1 -maxdepth 0 -depth -delete
zum Löschen.
DIe 1 ist gestern, die kann man ggfs. erhöhen für vorgestern, etc. Evtl. muss maxdepth auch auf 1, das soll die Behandlung von Unterordnern ausschließen.
Wenn man auch .JPG hat, dann halt auch -iname ... für mehrere Tage kann man ja auch noch ein "for i in {1..100} ; do ... ; done" drumrumbauen und die 1 durch $i und archiv.tar durch archiv_`date '+%y%m%d' -d '-$i days'`.tar ersetzen, das xargs sollte dann noch ein -n bekommen.
tag=6
for file in `ls -l *.jpg | awk -v tag="$tag" '$7==tag {print $9}'`
do tar uf "Bilder-$tag.tar" "$file" --remove-files
done
Das erzeugt ein tar-Archiv (Bilder-6.tar) und löscht alle Dateien (von tag 6).
Funktioniert mit GNU tar, ändere "tag" zu deinem gewünschten Tag (z.B. 6 = 6.).
Oder wenn du auch noch Monat dazu möchtest:
tag=6
mon="Apr"
for file in `ls -l | awk -v mon="$mon" -v tag="$tag" '$6==mon && $7==tag {print $9}'`
do tar uf "Bilder-$tag-$mon.tar" "$file" --remove-files
done
"tag" und "mon" anpassen. Erzeugt Archiv: "Bilder-6-Apr.tar" und löscht entsprechende Dateien.
hier ein Script in tcl. Bei den gängigen Distributionen ist tcl ( die tclsh-Shell) bereits installiert.
Schreibe die Zeilen in eine Datei, mache sie ausführbar und führe sie aus.
Dieses Script läuft in einer Endlosschleife. Beim Start wird ein Tar-Archiv mit dem Namen bilder<aktueller Tag>-<aktueller Monat>-<aktuelles Jahr>.tar angelegt.
In der Endlosschleife ( while { 1 } ) wird das aktuelle Datum ermittelt ( set neuDate ...) und geprüft, ob es wirklich neu ist ( if { $newDate == $date } ). Wenn es ein neuer Tag ist, wird ein neues Tar-Archiv angelegt, da date den Wert von newDate erhält.
für jede jpg-Datei wird das Tar-Archiv um diese Datei erweitert
( eval exec tar -uf bilder$date.tar $jpegBild )
anschließend wird genau diese Datei gelöscht ( file delete -force $jpegBild )
mit after 60000 wartet das Programm 60 Sekunden und prüft wieder das Datum.
Da tar -u das Archiv nach diesem Update immer wieder schließt, kann man jederzeit z.B. mit tar -tf <Name> sehen, was da drin ist und auch etwas herauslesen.
Das Ganze kann man auch noch schöner machen. Da aber, wenn du es wirklich so machen willst.
#!/bin/bash
# \
exec tclsh "$0" "$@"
set date [clock format [clock seconds ] -format %d-%m-%Y ]
eval exec tar -uf bilder$date.tar
while { 1 } {
set newDate [clock format [clock seconds ] -format %d-%m-%Y ]
if { $newDate != $date } { set date $newDate }
foreach jpegBild [glob -nocomplain *.jpg ] { eval exec tar -uf bilder$date.tar $jpegBild ; file delete -force $jpegBild }
after 60000
}
wie schon im Antwort-Text kann ich auch hier den Code nicht so eingeben, wie das notwendig ist.
{ eval exec tar -uf bilder$date.tar $jpegBild ; file delete -force $jpegBild }
in diese ^^^^- Zeile gehört kein Zeilenumbruch
wie schon im Antwort-Text kann ich auch hier den Code nicht so eingeben, wie das notwendig ist.
Wenn man ihn aber aus der Box kopiert und in nano einfügt wird er aber richtig, also ohne Zeilenumbruch, dargestellt.
Linuxhase
Da ist ein Schönheitsfehler in Deinem find-Kommando, es sollte vielleicht eher der Parameter -iname verwendet werden ;-)
Linuxhase