112 votes

Suppression des fichiers de plus de 7 jours

J'ai écrit la commande ci-dessous pour supprimer tous les fichiers qui ont plus de 7 jours, mais cela ne fonctionne pas :

find /media/bkfolder/ -mtime +7 -name'*.gz' -exec rm {} \;

Comment puis-je supprimer ces fichiers ?

195voto

αғsнιη Points 33236

Comme @Jos l'a souligné, vous avez oublié un espace entre name et '*.gz' ; également pour accélérer l'utilisation de la commande -type f pour exécuter la commande sur f iles uniquement.

Donc la commande fixe serait :

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' \;

Explication :

  • find : la commande unix pour trouver f iles/ d irectories/ l encres, etc.
  • /path/to/ : le répertoire dans lequel vous devez commencer votre recherche.
  • -type f : trouver uniquement des fichiers.
  • -name '*.gz' : liste des fichiers qui se termine par .gz .
  • -mtime +7 : seuls sont pris en compte ceux dont le temps de modification est supérieur à 7 jours.
  • -execdir ... \; pour chaque résultat de ce type trouvé, effectuez la commande suivante dans ... .
  • rm -- '{}' : supprimer le fichier ; le {} est la partie où le résultat de la recherche est substitué à celui de la partie précédente. -- signifie la fin des paramètres de la commande, ce qui évite de provoquer une erreur pour les fichiers commençant par trait d'union .

Sinon, utilisez :

find /path/to/ -type f -mtime +7 -name '*.gz' -print0 | xargs -r0 rm --

から homme trouver :

-print0 
      True; print the full file name on the standard output, followed by a null character 
  (instead of the newline character that -print uses). This allows file names that contain
  newlines or other types of white space to be correctly interpreted by programs that process
  the find output. This option corresponds to the -0 option of xargs.

Ce qui est un peu plus efficace, car cela revient à :

rm file1 file2 file3 ...

par opposition à :

rm file1; rm file2; rm file3; ...

dans le cas du -exec méthode.


Une alternative et aussi plus rapide La commande est en utilisant le programme d'exécution + au lieu de \; :

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' +

Cette commande exécutera rm seulement une fois à la fin au lieu de chaque fois qu'un fichier est trouvé et cette commande est presque aussi rapide que l'utilisation de -delete comme suit en moderne find :

find /path/to/ -type f -mtime +7 -name '*.gz' -delete

11voto

zeke Points 111

Soyez prudent en supprimant des fichiers avec find. Exécutez la commande avec -ls pour vérifier ce que vous supprimez.

find /media/bkfolder/ -mtime +7 -name '*.gz' -ls . Ensuite, récupérez la commande dans l'historique et ajoutez -exec rm {} \;

Limitez les dommages que peut causer une commande de recherche. Si vous voulez supprimer les fichiers d'un seul répertoire, -maxdepth 1 évite de parcourir les sous-répertoires ou de chercher dans tout le système en cas de faute de frappe. /media/bkfolder / .

Les autres limites que j'ajoute sont des arguments de nom plus spécifiques comme -name 'wncw*.gz' en ajoutant un temps plus récent que -mtime -31 et en citant les répertoires recherchés. Ces éléments sont particulièrement importants si vous automatisez les nettoyages.

find "/media/bkfolder/" -maxdepth 1 -type f -mtime +7 -mtime -31 -name 'wncw*.gz' -ls -exec rm {} \;

7voto

user333305 Points 21

Par souci d'exhaustivité : vous pouvez également utiliser -delete

find /some/where/ -name '*.log' -type f -mtime +7 -delete

de cette façon, vous ne lancez pas une commande par fichier.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X