Bashskript: bearbeiten von Dateien je nach modification time

Jimini

PCGH-Community-Veteran(in)
Guten Morgen,

ich betreibe seit einigen Jahren einen Mailserver, welcher von mehreren Personen genutzt wird. Einige archivieren ihre E-Mails am 1.1. des Jahres, indem sie alle E-Mails aus dem Vorjahr in einen entsprechen Archivordner verschieben.
Zur Verdeutlichung ein Beispiel - aus
Code:
Posteingang
Gesendet
Rechnungen
     |_ Firma X
     |_ Firma Y
wird somit
Code:
Archiv
     2015
     |_ Posteingang
     |_ Gesendet
     |_ Rechnungen
          |_ Firma X
          |_ Firma Y

Die Archivierungslösung von Thunderbird funktioniert leider immer noch nicht zuverlässig. Daher würde ich das ganze gern direkt auf dem Server mittels eines Bashskripts lösen. Es müsste somit folgendes geschehen:
1. die Archivordner müssen angelegt werden
2. die E-Mails aus dem letzten Jahr müssen in den Archivordnern landen

Das Anlegen der Archivordner würde ich wie folgt lösen:
Code:
cd /pfad/zu/den/mails
find . -type d -not -path "./.Archives*" -not -path "./." -not -path "./sieve*" > /tmp/mailstructure
mkdir -p .Archives.$YEAR
cd .Archives.$YEAR
xargs mkdir -p < /tmp/mailstructure

Bei Punkt 2 bin ich mir nicht sicher, wie ich das realisieren soll. Am vielversprechendsten ist für momentan, mittels rsync alle E-Mails in den Archivordner zu kopieren und dann dort sowie in den Originalordnern aufzuräumen:
  1. E-Mails mit rsync ins Archiv kopieren (mit -t kann ich die modification time beibehalten), alternativ cp -p
  2. E-Mails, deren modification time im aktuellen Jahr liegt, aus dem Archiv löschen. Wie kann ich definieren, dass nur E-Mails ab dem 1.1. 00:00 gelöscht werden?
  3. E-Mails, deren modification time nicht im aktuellen Jahr liegt, aus dem aktuellen E-Mail-Bestand löschen. Wie kann ich definieren, dass nur E-Mails bis zum 1.1. 00:00 gelöscht werden?
Es läuft wahrscheinlich auf eine for-Schleife heraus, bei der find dann nur bestimmte Dateien findet und mittels -exec rm ... löscht. Ich weiß nur nicht, wie ich deie Zeitpunkt wirklich genau definieren kann.

Hat jemand eine Idee?

MfG Jimini
 
Zuletzt bearbeitet:
Moin,

wenn du in der for Schleife für jedes File ein
Code:
ls -l --time-style=long-iso $FILE | awk '{ gsub("-","",$6); print $6}'
ausführst, bekommst du ein Datum wie zB. 20150221 welches du bequem in einer if Schleife mit -gt und -le mit deinem Wunschdatum vergleichen kannst., was in deinem Falle dann 20XX1231 bzw 20XX0101 wäre.

Code:
if [ "$DATE" -gt "$JAHRESANFANG" ] && [ "$DATE" -le "$JAHRESENDE"]; then 
Bla bla bla Mr. Freeman...
Ich würde eher mit mv arbeiten, da im Fehlerfall die Datei nur im falschen Ordner landet und nicht im Nirvana.

BTW: In Scripten lieber mit absoluten Pfaden und ohne cd arbeiten, wenn es nicht unumgänglich ist. Das erspart bei komplexeren Arbeiten viel Kopfschmerzen und ist übersichtlicher. ;) Ich pack mir die Pfade immer in eine Variable, was Strukturanpassungen sehr viel einfacher macht.
 
Zuletzt bearbeitet:
Zurück