Ordner verschieben nach 3 Monaten - Inhalt der Ordner beachten

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
HansGraefe
Beiträge: 47
Registriert: 06.05.2022 15:04:32

Ordner verschieben nach 3 Monaten - Inhalt der Ordner beachten

Beitrag von HansGraefe » 24.10.2024 07:42:11

Hallo,

aktuell nutze ich folgenden cronjob, um alte Ordner zu bereinigen:

Code: Alles auswählen

0 4 * * *      root     find /var/www/html/data/* -mtime +90 -type d -not \( -name ausnahme1 -o -name ausnahme2 -o -name ausnahme3 -o -name ausnahme4 -o -name ausnahme5 -o -name eDOxuaTEeFl3n2BtS0lu -o -name ausnahme6 -o -name weitereausnahme \) -exec mv "{}" /var/www/alte-ordner/ \;
Jetzt ist es aber so, dass sich ggf. innerhalb der Ordner etwas ändert, zB. wenn innerhalb von /var/www/html/data/BEISPIELORDNER/ eine Datei geändert wurde. Wenn das der Fall ist, soll der Ordner ebenfalls nicht verschoben werden. Die Struktur ist folgende unterhalb von /var/www/html/data/ (die Namen der Dateien und Ordner sind immer unterschiedlich):

Code: Alles auswählen

ordner1/datei1.txt
       /datei2.txt
       /datei3.txt
ordner2/datei1.xml
       /datei2.pdf
       /datei3.txt   
BEISPIELORDNER/dateixyz.txt
              /datei3.txt
              /datei444.yaml
Also gibt es eine Möglichkeit, beides zu beachten: ob der Ordner älter als 90 Tage ist UND ob sich innerhalb des Ordners seitdem etwas verändert hat? Ich weiß ja leider vorher nicht, wie der Ordner, hier "BEISPIELORDNER", heißt, sonst könnte ich ihn theoretisch oben im Befehl mit angeben.

Wenn ich das -type d weglasse, findet er natürlich auch massig Dateien die aber nicht beachtet werden sollen, weil ich den kompletten Ordner verschiebe.

Und gibt es eventuell eine Möglichkeit, die Ausnahmen in einer Textdatei zu pflegen? Ich habe nur einige wenige Ausnahmen eingefügt, es sind noch viel mehr und es kommen weitere dazu.

(System ist immer Debian 12)

chrbr
Beiträge: 623
Registriert: 29.10.2022 15:53:26

Re: Ordner verschieben nach 3 Monaten - Inhalt der Ordner beachten

Beitrag von chrbr » 24.10.2024 11:24:07

HansGraefe hat geschrieben: ↑ zum Beitrag ↑
24.10.2024 07:42:11
Also gibt es eine Möglichkeit, beides zu beachten: ob der Ordner älter als 90 Tage ist UND ob sich innerhalb des Ordners seitdem etwas verändert hat? Ich weiß ja leider vorher nicht, wie der Ordner, hier "BEISPIELORDNER", heißt, sonst könnte ich ihn theoretisch oben im Befehl mit angeben.
Das ist interessant. Ich habe in einer älteren Ordnerstruktur unter ~/Projekte/python mal etwas ausprobiert. Dazu habe ich in einem Unterverzeichnis eine neue Datei ~/Projekte/python/Geocaching/Sudoku/neue_Datei angelegt. Ein Skript arbeitet nun erst die Verzeichnisse direkt unter ~/Projekte/python ab. Danach werden die Dateien und Unterverzeichnisse untersucht.

Code: Alles auswählen

#!/bin/sh

# Hier werden die Verzeichnisse unter ~/Projekte/python gefunden,
# die älter als 90 Tage sind.
for verzeichnis in $(find ~/Projekte/python/* -maxdepth 0 -type d -mtime +90)
do
echo $verzeichnis
# Die Verzeichnisse unter ~/Projekte/python werden nach Dateien durchsucht,
# die nicht älter als 90 Tage sind.
for datei in $(find $verzeichnis -mtime -90)
do
echo "neuer als mtime -90: "$datei
done
done
Die Ausgabe ist wie folgt:

Code: Alles auswählen

> ./ausmisten.sh
/home/chris/Projekte/python/DynamicPlots
/home/chris/Projekte/python/Geocaching
neuer als mtime -90: /home/chris/Projekte/python/Geocaching/Sudoku
neuer als mtime -90: /home/chris/Projekte/python/Geocaching/Sudoku/neue_Datei
/home/chris/Projekte/python/MTBF
/home/chris/Projekte/python/SlrnMime-1de9fb41e7cc
/home/chris/Projekte/python/TCP_Janus
So in der Art könntest Du das auch machen, also mit zwei Schleifen.

tobo
Beiträge: 2335
Registriert: 10.12.2008 10:51:41

Re: Ordner verschieben nach 3 Monaten - Inhalt der Ordner beachten

Beitrag von tobo » 24.10.2024 13:23:49

Die beiden Schleifen könnte man sich prinzipiell sparen, da find ja bereits schleifentechnisch operiert. Mit Schleifen ist es allerdings vielleicht lesbarer. Was die Ausnahmen-Datei angeht, könnte man sich eine Datei ~/ausnahme.txt in diesr Form anlegen:

Code: Alles auswählen

-name ausnahme1 -o 
-name ausnahme2 -o 
-name ausnahme3 -o 
-name ausnahme4 -o 
-name ausnahme5 -o 
-name eDOxuaTEeFl3n2BtS0lu -o 
-name ausnahme6 -o 
-name weitereausnahme
und diese ersatzweise einbinden durch:

Code: Alles auswählen

-not \( `<~/ausnahme.txt` \)
Verzeichnisse (dir) mit -name und Unterverzeichnisse (dir/dir) mit -wholename.
Würde dann insgesamt auf sowas ungefähr rauslaufen:

Code: Alles auswählen

find /var/www/html/data/ -type d -mtime +90 -not \( `<~/ausnahme.txt` \) -exec sh -c 'find "${1}" -type f -mtime -90 | grep -q . || mv "${1}" /var/www/alte-ordner/' _ {} \; 2>/dev/null
Das grep sorgt dafür, dass find einen Rückgabewert abhängig vom Suchergebnis liefert. Das Unterdrücken der Fehlermeldung am Ende ist jetzt gerade der Zeit geschuldet, dem Problem auf die Spur zu gehen. Er verschiebt die entsprechenden Verzeichnisse korrekt und schiebt dann aber eine Fehlermeldung nach, dass er die Verzeichnisse nicht findet.

EDIT:
Was diese angesprochene Art Fehlermeldungen angeht, da hilft wie üblich -depth:

Code: Alles auswählen

find /var/www/html/data/ -depth -type d -mtime +90 -not \( `<~/ausnahme.txt` \) -exec sh -c 'find "${1}" -type f -mtime -90 | grep -q . || mv "${1}" /var/www/alte-ordner/' _ {} \;
Und weil bei dir ja eine flache Verzeichnisstruktur (1 tief) vorliegt, ist der Hinweis mit -wholename überflüssig. Gäbe es auch Unterverzeichnisse, dann müsste man sowieso nachbessern...

HansGraefe
Beiträge: 47
Registriert: 06.05.2022 15:04:32

Re: Ordner verschieben nach 3 Monaten - Inhalt der Ordner beachten

Beitrag von HansGraefe » 28.10.2024 09:40:57

Hat sich erledigt, klappt. Danke!

Antworten