Drache schrieb:
mkdir ./(date +%Y/%m)
(das müsste doch passen??)
Das müßte ja dann 2 Verzeichnisse auf einmal erzeugen. Das geht auch, aber mit dem Schalter -p. So könntest Du für jeden Monat der Jahre 08-10 einen Ordner machen:
for y in {2008..2010} ; do for m in {01..12}; do mkdir -p $y/$m; done ; done
Dann schiebst Du die Dateien in den passenden Ordner, und löschst die, die leer geblieben sind:
find -empty -delete
Jetzt ist die Frage mit dem Mittelteil - wie kopierst Du die Dateien in den richtigen Ordner.
Mit
find -mtime +365 -exec mv {} 2009/04 \;
könntest Du - ohne daß die Zahl jetzt genau wäre, alle Dateien älter als 1 Jahr i.d. Ordner 09/04 schieben - angenommen, das wären die ältesten.
Dann reduzierst Du je nach Monat die -mtime um ca. 30 Tage, und incrementierst den Ordnermonat oder das Jahr.
Wie kann man das weiter automatisieren?
Man kann an den Ordner eine '/01' anhängen, und hat etwas was wie ein richtiges Datum aussieht:
for d in $(ls -d 2010/*) ; do date -d $d/01 ; done
Fr 1. Jan 00:00:00 CET 2010
Mo 1. Feb 00:00:00 CET 2010
Mo 1. Mär 00:00:00 CET 2010
Do 1. Apr 00:00:00 CEST 2010
Sa 1. Mai 00:00:00 CEST 2010
Di 1. Jun 00:00:00 CEST 2010
Do 1. Jul 00:00:00 CEST 2010
So 1. Aug 00:00:00 CEST 2010
Mi 1. Sep 00:00:00 CEST 2010
Fr 1. Okt 00:00:00 CEST 2010
Mo 1. Nov 00:00:00 CET 2010
Mi 1. Dez 00:00:00 CET 2010
na toll! ☺
date kennt leider keine Option '+%mtime', d.h. dass man die Tage vor oder nach heute geliefert bekäme für ein Eingabedatum. Sonst könnte man das an find übergeben, als Kriterium.
Aber da gibt es noch touch. Mit touch kann man einer Datei ein Datum/eine Zeit verpassen, und so können wir in jeden Ordner einen Zeitstempel legen:
for d in $(ls -d 20*/*) ; do touch -d $d/01 $d/stamp; done
Das ist gewieft, wenn auch noch nicht restlos klar ist, wie uns das weiterhilft.
find -name 'stamp' -ls
45657 0 -rw-r--r-- 1 stefan stefan 0 Jan 1 2008 ./2008/01/stamp
46475 0 -rw-r--r-- 1 stefan stefan 0 Feb 1 2008 ./2008/02/stamp
46476 0 -rw-r--r-- 1 stefan stefan 0 Mär 1 2008 ./2008/03/stamp
46477 0 -rw-r--r-- 1 stefan stefan 0 Apr 1 2008 ./2008/04/stamp
...
usw.
Nun haben wir in jedem Zielverzeichnis den Zeitstempel des Referenzdatums.
for y in {2010..2008}
do
for m in {12..01}
do
find -maxdepth 1 -type f -cnewer $y/$m/stamp -exec mv {} $y/$m \;
done
done
Ob -maxdepth für Dich sinnvoll ist mußt Du wissen. Durch die umgekehrte Sortierung der Daten schiebt man erst die jüngsten weg, dann bleiben die 2.-jüngsten über, die 3.jüngsten usw., bis alles verschoben ist.
Dann kann man mit obigem delete-Schalter die leeren Verzeichnisse löschen, wenn man zuvor die stamp-Files ähnlich löscht.
Bei mir verschob ich 4 Dateien zum Test, aber eine, vom Nov. landete im Ordner 12 - keine Ahnung wieso.
find 20* -type f -ls
41537 4 -rw-r--r-- 1 stefan stefan 10 Aug 7 2008 2008/08/D\ D
41563 4 -rwxr-xr-x 1 stefan stefan 466 Aug 7 2008 2008/08/backup.sh
84106 4 -rw-r--r-- 1 stefan stefan 11 Nov 23 21:48 2009/12/m\ m.txt
252051 28 -rw-r--r-- 1 stefan stefan 26230 Mai 5 21:28 2010/05/bottles.ook
Also alles ohne Gewähr - am besten vorher eine Sicherheitskopie anfertigen.