Dateien nach Datum in ein Tar-Archiv packen?

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.

Woher ich das weiß:Studium / Ausbildung – Informatiker

Linuxhase  06.04.2018, 21:28

Da ist ein Schönheitsfehler in Deinem find-Kommando, es sollte vielleicht eher der Parameter -iname verwendet werden ;-)

Linuxhase

0
iQa1x  06.04.2018, 22:09
@Linuxhase

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.

0
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.

Woher ich das weiß:Berufserfahrung – openSuSE seit 1995

guenterhalt  06.04.2018, 10:55
#!/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
0
Linuxhase  06.04.2018, 21:23
@guenterhalt
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

0