2010-07-01 2 views
2

-pas sûr que cela appartient ici ou sur serverfault-supprimer tous, mais 5 derniers répertoires avec script shell et trouver commande

Ce que je veux faire la liste de tous les répertoires dans un répertoire et supprimer tous, sauf pour le dernier 5. nous avons un système de déploiement en place qui progressivement faire lien quelque chose ceci:

/var/www/html/build1 
/var/www/html/build2 
/var/www/html/build3 
/var/www/html/build4 
/var/www/html/build5 
/var/www/html/build6 
/var/www/html/build7 
/var/www/html/build8 
/var/www/html/build9 
/var/www/html/build10 

cette utilise l'espace disque trop si bien nous voulons seulement garder les 5 derniers builds.

je suis venu avec les éléments suivants:

(trouver/var/www/html/-type d -name "build *" | sort -r) /var/www/html/build1564 /var/www/html/build1563 /var/www/html/build1560 /var/www/html/build1558 /var/www/html/build1557 /var/www/html/build1556 /var/www/html/build1555 /var/www/html/build1554 /var/www/html/build1553 /var/www/html/build1552 /var/www/html/build1551 /var/www/html/build1550 Maintenant, tout ce que j'ai besoin de faire est d'ajouter un "offset" à cette commande, de sorte que les cinq premiers répertoires n'apparaissent pas. Après cela, les répertoires restants doivent être supprimés.

S'il n'y a pas plus de 5 répertoires, rien ne devrait se produire.

Je suppose qu'il me manque encore deux étapes ici, l'étape de décalage et l'étape rm -rf?

Répondre

3

Vous ne pouvez pas utiliser sort cette façon parce qu'il ne reconnaît pas que build10 > build9, par exemple. Vous devez couper le préfixe manuellement:

for dir in build* 
do 
    echo "${dir#build}" 
done | sort -n | head -n -5 | xargs -I '%' echo -r 'build%' 

Voici un exemple qui montre où votre code d'origine échoue:

/tmp $ mkdir build8 build9 build10 
/tmp $ find . -type d -name "build*" | sort -r 
./build9 
./build8 
./build10 
+0

merci pour le conseil, y at-il un moyen de le faire dans la commande donnée ci-dessus? – Jorre

+0

Mon code (corrigé) est très proche de la réponse de mb14, la seule différence étant la boucle 'for' et l'option' -n' pour 'sort'. Je n'ai pas utilisé 'find' car vos répertoires' build' semblent être des sous-répertoires directs d'un parent commun. – Philipp

+0

le code me donne un ordre incorrent des répertoires de construction à supprimer. il donne (avec le tri normal) build10001, build50, build60, ... cela devrait être build10001, build60, build50, ... – Jorre

4

Pour obtenir tout sauf firt 5 utiliser tail -n +5 (je pense que vous n'avez pas besoin d'inverser le genre alors) et de les rm vous pouvez utiliser xargs. Donc vous pouvez essayer ceci

trouver/var/www/html/-type d -name "build *" | trier | queue -n +5 | xargs -I% echo -rf%

(remplacer écho avec rm pour le faire)

+0

grâce, la queue 5 me donne: ne peut pas ouvrir '5' pour la lecture : Aucun fichier ou répertoire – Jorre

+0

vient de découvrir pourquoi, il a besoin de queue -n +5 – Jorre

+0

la commande complète me donne "xargs:%": aucun fichier ou répertoire – Jorre

Questions connexes