Supprimer tout sauf les files les plus récents

Disons que j'ai un directory ḟoo/ qui contient beaucoup de files dans une sorte de structure de directory. Je dois garder certains d'entre eux, mais pas tout.

Existe-t-il un moyen de (en place) de supprimer tous, sauf (disons) 500 plus récents?

6 Solutions collect form web for “Supprimer tout sauf les files les plus récents”

Je fais cette tâche régulièrement, et j'utilise des variantes de ce qui suit. Il s'agit d'un pipeline combinant différents outils simples: searchz tous les files, prévoyez le time de modification du file, sortingmez, supprimez le time de modification du file, affichez toutes les lignes, à l'exception des 500, et supprimez-les:

 find foo/ -type f | perl -wple 'printf "%12u ", (stat)[9]' | \ sort -r | cut -c14- | tail -n +501 | \ while read file; do rm -f -- "$file"; done 

Quelques commentaires:

  • Si vous utilisez "bash", vous devez utiliser "read -r file", pas simplement "read file".

  • L'utilisation de "perl" pour supprimer les files est plus rapide (et gère également les caractères "étranges" dans les noms de files que la boucle while, sauf si vous utilisez "read -r file"):

     ... | tail -n +501 | perl -wnle 'unlink() or warn "$_: unlink failed: $!\n"' 
  • Certaines versions de "queue" ne prennent pas en charge l'option "-n", donc vous devez utiliser "queue +501". Une façon portable de sauter les 500 premières lignes est

      ... | perl -wnle 'print if $. > 500' | ... 
  • Cela ne fonctionnera pas si vos noms de files contiennent des lignes nouvelles.

  • Il ne nécessite pas de find GNU.

La combinaison de ce qui précède vous donne:

 find foo/ -type f | perl -wple 'printf "%12u ", (stat)[9]' | \ sort -r | cut -c14- | perl -wnle 'print if $. > 500' | \ perl -wnle 'unlink() or warn "$_: unlink failed: $!\n"' 

C'est ainsi que je le ferais dans Python 3. qui devrait également fonctionner pour d'autres systèmes d'exploitation. Après avoir testé ceci, assurez-vous de décommenter la ligne qui supprime réellement les files.

 import os,os.path from collections import defaultdict FILES_TO_KEEP = 500 ROOT_PATH = r'/tmp/' tree = defaultdict(list) # create a dictionary containing file names with their date as the key for root, dirs, files in os.walk(ROOT_PATH): for name in files: fname = os.path.join(root,name) fdate = os.path.getmtime( fname ) tree[fdate].append(fname) # sort this dictionary by date # locate where the newer files (that you want to keep) end count = 0 inorder = sorted(tree.keys(),reverse=True) for key in inorder: count += len(tree[key]) if count >= FILES_TO_KEEP: last_key = key break # now you know where the newer files end, older files begin within the dict # act accordingly for key in inorder: if key < last_key: for f in tree[key]: print("remove ", f) # uncomment this next line to actually remove files #os.remove(f) else: for f in tree[key]: print("keep ", f) 

Je ne connais pas le «500 plus récent», mais je trouve que vous pouvez supprimer des éléments anciens de X minutes / jours. Exemple de file et plus de 2 jours:

 find foo/ -mtime +2 -a -type f -exec rm -fv \{\} \; 

Testez d'abord avec:

 find foo/ -mtime +2 -a -type f -exec ls -al \{\} \; 

Faites attention aux barres obliques et à l'espace avant "\;". Consultez la page find man pour plus d'informations.

si vous pouviez faire avec des files x jours / heures plus tmpwatch --ctime 7d le plus récent numéro X, vous pouvez le faire simplement avec tmpwatch --ctime 7d

Je pense que les options -mtime et -newer de find sont utiles pour vous. Vous pouvez voir l' man find pour plus d'informations.

pourquoi ne pas utiliser ce code plus simple:

 $ ls -t1 foo/| xargs -d '\n' rm -- 
  • Ssortingping LVM à travers plusieurs masortingces MD-RAID
  • Utilisation de SoX pour réduire le bruit sur AAC dans un conteneur MPEG-4
  • De bonnes pratiques pour mettre à jour les servers?
  • Le dossier Linux contient un nom de domaine ajouté
  • solution pour un server hors ligne
  • Mac / Linux pour tâches d'administration système
  • Variables d'environnement Linux (Ubuntu), shells et security
  • Utilisation de Upstart pour gérer le tunnel inversé AutoSSH
  • Affichage de la progression totale dans rsync: est-ce possible?
  • Comment sortinger les résultats supérieurs sur la memory virtuelle sur Redhat Linux?
  • Différence entre "fsck -y" vs "fsck -a"
  • Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de rĂ©seau.