Es ist wahrscheinlich möglich, dies zu tun, ohne Dateien mit Prozesssubstitution oder so etwas zu erstellen, aber hier ist eine schnelle und schmutzige Lösung:
find . -type f -mtime +30 -printf '%h\n' | sort | uniq > old.txt
find . -type f -mtime -30 -printf '%h\n' | sort | uniq > new.txt
grep -vf new.txt old.txt
Der erste Befehl gibt den Pfad jeder Datei aus, die vor mehr als 30 Tagen geändert wurde (in -printf
von find -- zumindest mit GNU find auf meinem System -- %h
druckt den gesamten Pfad außer dem eigentlichen Dateinamen), sortiert diese dann und entfernt alle Duplikate und legt das Ganze in eine Datei namens old.txt
.
Der zweite Befehl macht dasselbe, aber mit jeder Datei, die vor weniger als 30 Tagen geändert wurde, und fügt sie in eine andere Datei ein, new.txt
.
Die grep-Zeile gibt jede Zeile aus old.txt aus, die nicht in new.txt vorkommt – also gibt sie Ihnen eine Liste von Verzeichnissen, die nur enthalten Dateien, die vor mehr als 30 Tagen zuletzt geändert wurden.
Dies alles unter Verwendung der GNU-Versionen der Dienstprogramme. Ich weiß nicht, ob die Syntax mit den BSD-Versionen übereinstimmt usw.
Endlich den magischen Einzeiler herausgefunden:
for dir in `find . -type d -mtime +30`; do test `find $dir -type f -mtime -30 -print -quit` || echo $dir; done
Dadurch werden alle Verzeichnisse gedruckt, die eine Änderungszeit von mehr als 30 Tagen aufweisen und in denen in den letzten 30 Tagen keine Dateien geändert wurden.