2010-03-23 10 views
0

J'ai un répertoire où vont nos déploiements. est nommé dans le format Un déploiement (qui est lui-même un répertoire):script bash pour supprimer les anciens déploiements

<application-name>_<date> 

e.g. trader-gui_20091102 

Il existe de multiples applications déployées sur ce même répertoire parent, de sorte que le contenu de pourrait ressembler le répertoire parent ceci:

trader-gui_20091106 
trader-gui_20091102 
trader-gui_20091010 
simulator_20091106 
simulator_20091102 
simulator_20090910 
simulator_20090820 

Je veux écrire un script bash pour nettoyer tous les déploiements sauf pour la plus récente de chaque application. (Le plus récent désigné par la date dans le nom du déploiement). Donc, exécuter le script bash sur le répertoire parent ci-dessus laisserait:

trader-gui_20091106 
simulator_20091106 

Toute aide serait appréciée.

Répondre

1

Un one-liner rapide:

ls | sed 's/_[0-9]\{8\}$//' | uniq | 
while read name; do 
    rm $(ls -r ${name}* | tail -n +2) 
done 

Liste des fichiers, couper un trait de soulignement suivi de huit chiffres, ne garder que des noms uniques. Pour chaque nom, supprimez tout sauf le plus récent.

Hypothèses:

  • les plus récentes seront les derniers lorsqu'ils sont triés par ordre alphabétique. Si ce n'est pas le cas, ajoutez un tri qui fait ce que vous voulez dans le pipeline avant tail -n +2
  • aucun autre fichier dans ce répertoire. Si c'est le cas, limitez la sortie de ls, ou passez-la à travers un grep pour sélectionner uniquement ce que vous voulez.
  • aucun caractère bizarre dans les noms de fichiers. S'il y a ... au lieu d'utiliser directement la sortie du pipeline interne ls, vous voudrez probablement le faire passer dans une autre boucle afin de pouvoir citer les lignes individuelles, ou bien le capturer dans un tableau pour pouvoir utiliser le expansion citée.
+0

travail Grand, merci. – Ben

0
shopt -s exglob 
ls|awk -F"_" '{a[$1]=$NF}END{for(i in a)print i"_"a[i]}'|while read -r F 
do 
    rm !($F) 
done 

depuis votre date dans le nom de fichier est déjà "sortable", la commande awk trouve le dernier fichier de chaque application. rm (!$F) signifie simplement supprimer le nom de fichier qui n'est pas le plus récent.

0

Vous pouvez essayer trouver:

# Example: Find and delete all directories in /tmp/ older than 7 days: 
find /tmp/ -type d -mtime +7 -exec rm -rf {} \; &>/dev/null