Supprimer tous les fichiers créés avant une certaine date


26

J'ai un répertoire contenant un grand nombre de fichiers (comme des journaux pour chaque jour de l'année). Je voudrais supprimer tous les fichiers créés avant disons le 22/11. Comment puis-je y parvenir? Dois-je utiliser findensuite exec -rm? J'utilise ksh.


1
La mise en garde habituelle est que les systèmes de fichiers Unix ne contiennent généralement pas un enregistrement du moment où le fichier a été créé - que les temps que le inode et le contenu ont été la dernière modification sont disponibles.
Toby Speight

Réponses:


35

L'utilisation findest toujours le moyen préféré de supprimer des fichiers. Voir http://mywiki.wooledge.org/UsingFind pour en savoir plus.

Une façon de procéder consiste à créer un fichier contenant l'horodatage. par exemple

touch -t 201311220000 /tmp/timestamp

Supprimez maintenant les fichiers GNU find(en supposant dans le répertoire courant) qui correspondent à l'horodatage, par exemple:

find . -type f ! -newer /tmp/timestamp -delete  

ou trouver non GNU

find . -type f ! -newer /tmp/timestamp -exec rm {} \;

2
Et ça ? Est-ce que ça marche ? find -type f -mtime +5 -exec rm -f {} \;
user1058398

1
@ user1058398 Cela supprimera les fichiers de plus de 5 jours à partir de maintenant.
Valentin Bajrami

Supprime-t-il également le dossier avec les fichiers? @ val0x00ff
alper

1
@Avatar non, car la type -flimite l'action aux fichiers uniquement.
Valentin Bajrami

22

Avec GNU ou certains BSD find:

find . ! -newermt 2013-11-22 ! -type d -delete

Notez qu'il vérifie la dernière heure de modification des fichiers. Sur certains BSD, vous pouvez utiliser -newerBtà la place de -newermtpour vérifier l' heure de naissance de l' inode du fichier si disponible à la place.


1
find /path/to/directory/ -mtime +<number of days> -name '<file name>' -exec rm -rf {} \;

Exemple:

find /Netap_fileshare_backup/SQL/DB_backups/xeo/ -mtime +15 -name 'ORA_XEO*' -exec rm -rf {} \;

Dans ce cas, il supprimera tous les fichiers qui commencent par "ORA_XEO" avec plus de 15 jours.


Bien qu'il vaut mieux le regarder avec le rm -rf, la première commande supprimerait tout ce qui est contenu dans les répertoires antérieurs à ces 15 jours. (Aussi, pourquoi les parenthèses autour -name?)
ilkkachu

Vous avez raison, nous n'avons pas besoin de mettre "(" ")".
calafate du

mais si nous voulons ajouter une condition, cela peut être utile. par exemple, si nous voulons supprimer tous les fichiers se terminant par ".jar" ou ".cp", et commencer par "ex". example.jar- il sera supprimé example.cp- il sera supprimé example.tar- il ne sera pas supprimé
calafate

dans ce cas, nous pouvons utiliser:find /path/to/directory/ -mtime +<number of days> \( -name '*.jar' -o -name '*.cp' \) -name 'ex*' -exec rm -rf {} \;
calafate

Cela supprimera certains fichiers du <nombre de jours> plutôt que tous les fichiers antérieurs à <nombre de jours>, sauf si vous l'exécutez exactement à minuit et qu'il se termine en une seconde. Avec GNU, findvous devez utiliser le -daystartmodificateur pour contraindre la -mtimevaleur à minuit.
roaima
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.