Trouver des répertoires avec tous les fichiers à l'intérieur de plus de X?

Est-il possible sur linux de trouver des répertoires où tous les fichiers et répertoires contenus (et les fichiers de sous-répertoires, etc.) sont plus anciens qu'un âge donné? En d'autres termes, si un répertoire possède un ou plusieurs fichiers dans lesquels il existe une date de modification plus récente qu'un seuil donné, ce répertoire ne doit pas être répertorié. Si tous les fichiers et dossiers sous ce répertoire sont plus anciens que le seuil donné, ce répertoire devrait être répertorié.

Le cas d'utilisation est que mon répertoire personnel est plein de répertoires cachés, et je suis sûr que beaucoup d'entre eux sont laissés à l'écart des installations précédentes et des logiciels que je n'ai pas utilisés depuis des années. Je voudrais pouvoir trouver ces répertoires, donc je peux facilement décider de les supprimer.

Il est probablement possible de le faire sans créer de fichiers en utilisant la substitution de processus ou quelque chose, mais voici une solution rapide et sale:

 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 émet le chemin de chaque fichier modifié il y a plus de 30 jours (dans find's -printf – au moins avec la recherche GNU sur mon système – %h imprime tout le chemin sauf le nom réel du fichier), puis trie ceux et Se débarrasse de tout doublon, et met 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 met dans un autre fichier, new.txt .

La ligne grep imprime toutes les lignes de old.txt qui n'apparaissent pas dans new.txt – afin de vous donner une liste de répertoires contenant uniquement des fichiers qui ont été modifiés il y a plus de 30 jours.

Tout cela utilise les versions GNU des utilitaires. Je ne sais pas si la syntaxe correspond aux versions BSD, etc.

Finalement, j'ai découvert l'one-liner 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 ayant un temps de modification supérieur à 30 jours et aucun fichier modifié au cours des 30 derniers jours.

Celui-ci devrait fonctionner:

 for DIR in {the folder list}; do if [[ $(find ${DIR} -mtime -10 -type f) == "" ]]; then echo ${DIR} fi done 

Il trouve tous les répertoires dans {la liste des dossiers}, qui contient des fichiers de plus de 10 jours.

Fondamentalement, ce que find ${DIR} -mtime -10 -type f fait est de trouver tous les fichiers ( -type f ) qui sont modifiés dans les 10 jours ( -mtime -10 , qui est différent de -atime ou -ctime , voir ici pour Plus d'informations: http://www.cyberciti.biz/faq/howto-finding-files-by-date/ ). Si de tels fichiers ne se trouvent pas dans un répertoire, nous savons que ce répertoire est supérieur à 10 jours, et nous publions ce répertoire avec echo ${DIR} .

J'espère que cela aide!

 find -type f -mtime +30 

Vérifier les fichiers de plus de 30 jours

Si vous ajoutez -iname '.*' Il vous montrera les fichiers cachés

Ou -type d pour les répertoires

Vous pouvez utiliser la solution de contournement suivante pour mettre en œuvre votre besoin:

 $ touch -t 201206010100 some_file $ find . -newer some_file 

À la page tactile:

 -t STAMP use [[CC]YY]MMDDhhmm[.ss] instead of current time 

Il y a aussi une option -d de contact mais je ne l'ai pas utilisé. Vous pourriez essayer.

[Modifier], vous pouvez utiliser l'option touch -d comme suit pour générer un fichier à une date donnée:

 $ touch -d "Wed Jun 27 09:44:44 EEST 2012" some_file $ ls -l some_file -rw-r--r-- 1 user user 0 2012-06-27 09:44 some_file 

Vous pourriez utiliser la même approche que j'ai mentionnée ci-dessus