J'ai déjà vu des paquebots utiliser ls, mais j'aimerais éviter cela.
J'écris un script qui copie le code sur mon serveur dans un dossier horodaté. La version "actuelle" est toujours liée de manière symétrique à un chemin constant. De cette façon, je peux revenir en arrière si quelque chose ne va pas. Désormais, chaque déploiement crée un nouveau dossier, mais j'aimerais ne conserver que les 3 derniers.
Voici ma version actuelle:
ls -tp | grep '/$' | grep -v 'current\|shared' | tail -n +4 | xargs -d '\n' rm -rf --
Ceci est exécuté dans le dossier contenant, exclut les fichiers et les deux dossiers «actuel» et «partagé» que je veux conserver (actuellement le lien symbolique susmentionné), et supprime tous les fichiers sauf les 3 les plus récents ls -t
.
Y a-t-il un moyen de faire cela sans ls
utiliser uniquement bash et la chaîne d'outils gnu?
Tous les dossiers destinés à l’élagage portent les noms suivants:
$timestamp.$branch.$sha1
Où SHA1 et branch sont des informations de git sur ce qui a été déployé exactement.
Le serveur exécute Ubuntu Xenial.
Edit: Fournissez quelques exemples de ce à quoi ressemblent les dossiers.
Voici une liste du dossier de déploiement, à quoi il ressemble maintenant:
drwxr-x--- 13 app www-data 4096 Mar 29 00:10 1490738956.develop.b806/
drwxr-x--- 13 app www-data 4096 Mar 29 00:19 1490739485.develop.ae01/
drwxr-x--- 14 app www-data 4096 Mar 29 03:33 1490751118.develop.f5b0/
lrwxrwxrwx 1 app www-data 40 Mar 29 03:33 current -> /home/app/deploy/1490751118.develop.f5b0/
drwx------ 5 app root 4096 Mar 10 04:12 shared/
la source
Réponses:
Comment supprimer tous les 3 sous-dossiers les plus récents d'un dossier?
Vous pouvez utiliser
find
,sort
,awk
,xargs
et enfinrm
:Panne:
find
outil polyvalent pour rechercher des fichiers et des répertoires et éventuellement exécuter des commandes sur ceux-ci*
prendre en compte les éléments du dossier en cours-maxdepth 0
ne pas regarder dans les sous-dossiers-type d
chercher des annuaires-not -path "current"
exclure le répertoire nommé "courant"-not -path "shared"
exclure le répertoire nommé "partagé"-printf "%T@ %p\n"
imprimer les résultats en ajoutant l'horodatage devant les noms de répertoire. Cela pourrait être omis dans votre cas, car les répertoires sont déjà horodatés.| sort -nr
trier la liste en fonction de l'horodatage, dans l'ordre inverse| awk 'NR > 3 {print $2}'
affiche tous les résultats sauf les trois premiers, en omettant l'horodatage ajouté précédemment. C’est là que vous choisissez le nombre à garder, il suffit de substituer le nombre3
| xargs rm -rf
supprimer ces répertoires et tout leur contenuEdit: dans votre cas, puisque les noms des répertoires commencent déjà par un horodatage, il n’est pas nécessaire de rajouter l’horodatage pour
sort -nr
être effectif. Notez que laawk
syntaxe doit être modifiée en conséquence.Référence: voir ces deux questions / réponses utiles / similaires.
la source
Dans sa forme la plus élémentaire
Tiré de https://serverfault.com/questions/122824/linux-using-find-to-locate-files-older-than-date
! -newer some_file
lui dit de correspondre à tout ce qui n'est pas plus récent que 'some_file'-name \*.develop.\*
lui dit de ne faire correspondre que les noms correspondant à ce modèle (* .develop. *)-delete
- J'espère que cela ne nécessite aucune explication, soyez prudent! (Utilisez -print pour tester!)-type d
- seulement les annuaires-maxdepth 0
- ne pas recurse dans les sous-dossiers.la source