LittleNoMuc
Anmeldungsdatum: 26. Januar 2016
Beiträge: 195
|
Die Situation: Ich habe ein Verzeichnis mit vielen Unterverzeichnissen. In diesen sind wiederum mehrere Dateien und nochmal Unterverzeichnisse. Von diesen will ich alles was älter als 31.12.2017 ist, jeweils in ein Unterverzeichnis "2017" verschieben. Das übersteigt jetzt meine shell-Fähigkeiten. Kann mir da mal jemand helfen?
|
redknight
Moderator & Supporter
Anmeldungsdatum: 30. Oktober 2008
Beiträge: 21730
Wohnort: Lorchhausen im schönen Rheingau
|
Vermutlich kannst Du das mit find bauen. Da ich deine Suchanforderung nicht verstehe, kann ich dir nur diesen Hinweis geben.
|
LittleNoMuc
(Themenstarter)
Anmeldungsdatum: 26. Januar 2016
Beiträge: 195
|
ok, hier die Erklärung: Alles passiert ausgehend von "Hauptverzeichnis". Innerhalb von "Unterverzeichnis1" befinden sich Ordner und Dateien. Es soll jetzt in "Unterverzeichnis1" ein Ordner Namens "2017" erstellt werden, und alles (egal ob Ordner oder Datei) was älter als 31.12.2017 ist soll da rein verschoben werden. Mit allen weiteren Unterverzeichnissen soll das Gleiche passieren.
- Bilder
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Dir muss aber bewusst sein, dass ein Ordner immer alle Dateien und Unterordner mitnimmt, wenn er verschoben wird. Und das bedeutet insbesondere, dass unter einem "alten" Ordner auch "neue" Dateien sein können. Verschieben von Ordnern ist dann womöglich nicht die richtige Option.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Wenn der Platz reicht, würde ich alles kopieren (mit Attributen bzw. Zeiterhaltend), und dann hier alles löschen, was jünger, da alles was älter ist, aber erst mal nur die Dateien. Am Ende evtl. leere Ordner löschen, wenn deren Zeitstempel das nahelegt, aber der ändert sich womöglich, wenn Dateien daraus gelöscht wurden.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
user_unknown schrieb: Wenn der Platz reicht, würde ich alles kopieren (mit Attributen bzw. Zeiterhaltend), und dann hier alles löschen, was jünger, da alles was älter ist, aber erst mal nur die Dateien.
Ich mag solche Lösungen nicht, die unnötig viel Arbeit machen. Und, wie Du schon schreibst, es kann Platzprobleme geben. Ich schlage mal folgende Lösung vor: | #!/bin/sh
# target directory, should be replaced by the real name later
export target=$(mktemp -d)
find -type f -exec sh -efc 'for f; do
year=$(date -r "$f" +%Y)
dir="$target/$year/$(dirname "$f")"
mkdir -p "$dir"
mv -v "$f" "$dir"
done' -- {} +
|
Ein paar Anmerkungen:
Das Verzeichnis $target darf nicht unter dem Suchverzeichnis liegen. Das Suchverzeichnis (hier implizit ".") sollte relativ angegeben werden, weil sonst die Pfade zu lang werden. Es wird für jedes gefundene Jahr ein Unterverzeichnis angelegt. Man müsste das noch ergänzen durch passende Suchkriterien:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | #!/bin/sh
# everything older than this is moved
latest=2017
# where to start the search
cd base/dir
# time stamp file
stamp=$(mktemp)
trap 'rm -f "$stamp"' 0
touch -d "${latest}-12-31 23:59:59" "$stamp"
# target directory, should be replaced by the real name later
export target=$(mktemp -d)
find -type f \! -newer "$stamp" -exec sh -efc 'for f; do
year=$(date -r "$f" +%Y)
dir="$target/$year/$(dirname "$f")"
mkdir -p "$dir"
mv -v "$f" "$dir"
done' -- {} +
|
Wenn Du jetzt noch die dynamische Ermittlung von $year in Zeile 18 rausnimmst, hast Du eigentlich das, was Du wolltest. Kleiner Umweg... ☺
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
rklm schrieb: user_unknown schrieb: Wenn der Platz reicht, würde ich alles kopieren (mit Attributen bzw. Zeiterhaltend), und dann hier alles löschen, was jünger, da alles was älter ist, aber erst mal nur die Dateien.
Ich mag solche Lösungen nicht, die unnötig viel Arbeit machen.
Es macht m.E. viel weniger Arbeit.
Einmal den ganzen, fraglichen Baum kopieren. Zeitstempeldatei anlegen find archiv/2017 -type f -cnewer timestamp -delete find aktuell -type f -not -cnewer timestamp -delete
Vorher natürlich testen mit ls:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | touch -d "01/01/2018" 01-01-2018.stamp
ls -la 01-01-2018.stamp
-rw-rw-r-- 1 stefan stefan 0 Jan 1 00:00 01-01-2018.stamp
find baum/archiv/ -type f -cnewer 01-01-2018.stamp -ls
1054947 4 drwxrwxr-x 2 stefan stefan 4096 Feb 20 03:47 tmp/giftig/
1048909 8 -rw-rw-r-- 1 stefan stefan 0 Feb 20 03:47 tmp/giftig/1\ file.tar.gz
1049012 8 -rw-rw-r-- 1 stefan stefan 0 Feb 20 03:47 tmp/giftig/5\ file.tar.gz
1049011 8 -rw-rw-r-- 1 stefan stefan 0 Feb 20 03:47 tmp/giftig/4\ file.tar.gz
1049003 8 -rw-rw-r-- 1 stefan stefan 0 Feb 20 03:47 tmp/giftig/2\ file.tar.gz
1049004 8 -rw-rw-r-- 1 stefan stefan 0 Feb 20 03:47 tmp/giftig/3\ file.tar.gz
find baum/aktuell/ -type f -not -cnewer 01-01-2018.stamp -ls
1054953 8 -rw-rw-r-- 1 stefan stefan 0 Sep 29 2016 tmp/giftig/abc3<foo.mp3
1053972 28 -rw-r--r-- 1 stefan stefan 18463 Nov 28 2012 tmp/giftig/zeilen\numbruch.zip
1053971 12 -rw-r--r-- 1 stefan stefan 84 Nov 28 2012 tmp/giftig/m\ d.sh
1059406 8 -rw-rw-r-- 1 stefan stefan 0 Dez 31 2016 tmp/giftig/dd\ dd
1059407 8 -rw-rw-r-- 1 stefan stefan 0 Dez 31 2016 tmp/giftig/ff\ ff
1053956 12 -rw-r--r-- 1 stefan stefan 160 Nov 28 2012 tmp/giftig/regex=*a*
1059399 8 -rw-rw-r-- 1 stefan stefan 0 Dez 31 2016 tmp/giftig/bb\ bb
|
In Wahrheit habe ich mit tmp/giftig, nicht mit archiv... /aktuell... getestet, aber das Prinzip wird klar.
Und, wie Du schon schreibst, es kann Platzprobleme geben.
Das kann man wissen oder untersuchen und man kann dem abhelfen.
Ein paar Anmerkungen:
Das ist eine vernünftige Annahme, die ich auch machen muss. ☺ Ich würde aber sogar eine dritte Kopie machen, als Sicherung, weil man so ein -not leicht mal bei beiden Befehlen eingibt oder weglässt. ☺ Kommt auf den Wert der Daten an. Für 10 Euro gibt's heute 32 GB Micro-SD-Cards, da passt eine Menge Arbeit drauf.
|
LittleNoMuc
(Themenstarter)
Anmeldungsdatum: 26. Januar 2016
Beiträge: 195
|
Dir muss aber bewusst sein, dass ein Ordner immer alle Dateien und Unterordner mitnimmt, wenn er verschoben wird. Und das bedeutet insbesondere, dass unter einem "alten" Ordner auch "neue" Dateien sein können.
Ist mir bewusst bzw. sogar gewollt. Verschieben statt kopieren ist deswegen nötig, weil das Ganze auf einem Nextcloud-Client passiert, der diese "Änderungen" dann auf den Server synchronisiert. NC erkennt ob ein Objekt verschoben oder kopiert wurde, und führt bei der Synchronisation dann das Gleiche aus. Bei großen Datenmengen ist es dann ein gewaltiger Unterschied ob er die Menge verschiebt (kaum Traffic/Serverlast) oder kopiert (es wird alles neu zum Server übertragen)
|
LittleNoMuc
(Themenstarter)
Anmeldungsdatum: 26. Januar 2016
Beiträge: 195
|
Ein paar Anmerkungen: Das Verzeichnis $target darf nicht unter dem Suchverzeichnis liegen.
hmm, genau das bräuchte ich aber
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
LittleNoMuc schrieb: Ein paar Anmerkungen: Das Verzeichnis $target darf nicht unter dem Suchverzeichnis liegen.
hmm, genau das bräuchte ich aber
Dann muss der find noch eine Option mitbekommen, die diesen Teilbaum von der Suche ausschließt. So müsste das dann gehen: | find -type d -name 2017 -prune -o -type f \! -newer "$stamp" -exec sh ...
|
Ist etwas unsauber, weil es auch Verzeichnisse an anderer Stele findet. Genauer ist | find -type d -path ./2017 -prune -o -type f \! -newer "$stamp" -exec sh ...
|
|