Il est probablement possible de le faire sans créer de fichiers à l'aide de la substitution de processus ou autre, mais voici une solution simple et rapide :
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
La première commande affiche le chemin de chaque fichier modifié il y a plus de 30 jours (dans le -printf
de find -- au moins avec la découverte GNU sur mon système -- %h
imprime tout le chemin sauf le nom de fichier réel), puis les trie et se débarrasse de tous les doublons, et met le tout dans un fichier appelé old.txt
.
La deuxième commande fait la même chose mais avec chaque fichier modifié il y a moins de 30 jours, et les place dans un autre fichier, new.txt
.
La ligne grep imprime chaque ligne de old.txt qui n'apparaît pas dans new.txt -- elle vous donnera donc une liste de répertoires contenant seulement fichiers dont la dernière modification remonte à plus de 30 jours.
Tout cela utilise les versions GNU des utilitaires. Je ne sais pas si la syntaxe correspond aux versions BSD, etc.
J'ai enfin compris la phrase magique :
for dir in `find . -type d -mtime +30`; do test `find $dir -type f -mtime -30 -print -quit` || echo $dir; done
Cela imprime tous les répertoires dont l'heure de modification est supérieure à 30 jours et aucun fichier modifié au cours des 30 derniers jours.