Probablemente sea posible hacer esto sin crear archivos mediante la sustitución de procesos o algo así, pero aquí hay una solución rápida y sucia:
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
El primer comando genera la ruta de cada archivo modificado hace más de 30 días (en -printf
de find -- al menos con GNU find en mi sistema -- %h
imprime la ruta completa excepto el nombre de archivo real), luego los ordena y elimina cualquier duplicado, y coloca todo en un archivo llamado old.txt
.
El segundo comando hace lo mismo pero con todos los archivos modificados hace menos de 30 días y los coloca en otro archivo, new.txt
.
La línea grep imprime cada línea de old.txt que no aparece en new.txt, por lo que le dará una lista de directorios que contienen solo archivos que se modificaron por última vez hace más de 30 días.
Todo esto es usando las versiones GNU de las utilidades. No sé si la sintaxis coincide con las versiones de BSD, etc.
Finalmente descubrí la frase mágica:
for dir in `find . -type d -mtime +30`; do test `find $dir -type f -mtime -30 -print -quit` || echo $dir; done
Esto imprime todos los directorios que tienen un tiempo de modificación superior a 30 días y ningún archivo modificado en los últimos 30 días.