Comment trouver et supprimer des fichiers plus anciens que certains jours sous unix?


38

J'ai un dossier de journal avec 7 dossiers. Ces sept dossiers ont aussi des sous-dossiers et ces sous-dossiers ont aussi des sous-dossiers. Je souhaite supprimer tous les fichiers de plus de 15 jours dans tous les dossiers, y compris les sous-dossiers, sans toucher à la structure des dossiers, ce qui signifie uniquement les fichiers.

mahesh@inl00720:/var/dtpdev/tmp/ > ls
A1  A2  A3  A4  A5  A6  A7

mahesh@inl00720:/var/dtpdev/tmp/A1/ > ls
B1 B2 B3 B4 file1.txt file2.csv

Réponses:


54

Vous pourriez commencer par dire find /var/dtpdev/tmp/ -type f -mtime +15. Cela permettra de retrouver tous les fichiers de plus de 15 jours et d’imprimer leur nom. Vous pouvez éventuellement spécifier -printà la fin de la commande, mais il s’agit de l’action par défaut. Il est conseillé d’exécuter d’abord la commande ci-dessus pour voir quels fichiers sont sélectionnés.

Après avoir vérifié que la findcommande répertorie les fichiers que vous souhaitez supprimer (et aucun autre), vous pouvez ajouter une "action" pour supprimer les fichiers. Les actions typiques pour faire ceci sont:

  1. -exec rm -f {} \;(ou, de manière équivalente -exec rm -f {} ';')
    Cela fonctionnera rm -fsur chaque fichier; par exemple,

    rm -f /var/dtpdev/tmp/A1/B1; rm -f /var/dtpdev/tmp/A1/B2; rm -f /var/dtpdev/tmp/A1/B3; …
    
  2. -exec rm -f {} +
    Cela fonctionnera rm -fsur plusieurs fichiers à la fois; par exemple,

    rm -f /var/dtpdev/tmp/A1/B1 /var/dtpdev/tmp/A1/B2 /var/dtpdev/tmp/A1/B3 …
    

    il est donc peut-être un peu plus rapide que l'option 1. (Il peut être nécessaire de l'exécuter rm -fplusieurs fois si vous avez des milliers de fichiers.)

  3. -delete
    Cela se dit findpour supprimer les fichiers, sans exécuter rm. Cela peut être infiniment plus rapide que les -execvariantes, mais cela ne fonctionnera pas sur tous les systèmes.

Donc, si vous utilisez l'option 2, la commande entière serait:

find /var/dtpdev/tmp/ -type f -mtime +15 -exec rm -f {} +

L'utilisation de -delete est plus simple (syntaxe et pas de processus enfants générés pour supprimer) mais peut ne pas fonctionner sur tous les systèmes. rm -f {} + est préférable, il supprimera les fichiers par lots s'il y a suffisamment de fichiers pour être trop nombreux pour une ligne de commande. rm -f {} ';' donnera une erreur de commande trop longue s'il y a assez de fichiers pour en avoir trop pour une ligne de commande.
Gaoithe

-1

Ou faites-le en boucle:

for x in $(find /var/dtpdev/tmp/ -type f -mtime +15); do rm "$x"; done

Cela ne fonctionnera pas avec des fichiers contenant des espaces.
Drav Sloan

Vous pouvez utiliser une boucle while à la place qui devrait prendre en charge les fichiers avec des espaces. find / var / dtpdev / tmp / -type f -mtime +15 | en lisant x; faire rm "$ x"; terminé
David Okwii
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.