Probabilmente è possibile farlo senza creare file utilizzando la sostituzione del processo o qualcosa del genere, ma ecco una soluzione rapida e sporca:
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
Il primo comando emette il percorso di ogni file modificato più di 30 giorni fa (in -printf
di find -- almeno con GNU find sul mio sistema -- %h
stampa l'intero percorso tranne il nome del file vero e proprio), poi li ordina e si sbarazza di eventuali duplicati, e inserisce il tutto in un file chiamato old.txt
.
Il secondo comando fa lo stesso ma con tutti i file modificati meno di 30 giorni fa e li inserisce in un altro file, new.txt
.
La riga grep stampa ogni riga da old.txt che non appare in new.txt -- quindi ti darà un elenco di directory che contengono solo file che sono stati modificati l'ultima volta più di 30 giorni fa.
Tutto questo utilizzando le versioni GNU delle utilità. Non so se la sintassi corrisponde alle versioni BSD, ecc.
Finalmente ho capito la magica battuta:
for dir in `find . -type d -mtime +30`; do test `find $dir -type f -mtime -30 -print -quit` || echo $dir; done
Stampa tutte le directory con un tempo di modifica superiore a 30 giorni e nessun file modificato negli ultimi 30 giorni.