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.

user1058398
la source
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 {} \;
Valentin Bajrami
la source
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.

Stéphane Chazelas
la source
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.

calafate
la source
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