Comment supprimer tous les sous-dossiers X les plus récents d'un dossier?

1

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 lsutiliser 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/
Mkaito
la source
1
Pouvez-vous ajouter quelques exemples de noms?
Choroba
Rechercher retournera les éléments plus récents que 'x' où x est un fichier. Vous créez le fichier avec l'horodatage dont vous avez besoin à l'aide de la touche.
djsmiley2k
D'après votre explication, il semble que vous souhaitiez "supprimer tous les 3 sous-dossiers les plus récents d' un dossier". Est-ce correct? Si tel est le cas, vous devez modifier le titre en conséquence, sinon veuillez ajouter des informations supplémentaires.
simlev

Réponses:

1

Comment supprimer tous les 3 sous-dossiers les plus récents d'un dossier?

Vous pouvez utiliser find, sort, awk, xargset enfin rm:

find * -maxdepth 0 -type d -not -path "current" -not -path "shared" -printf "%T@ %p\n" | sort -nr | awk 'NR > 3 {print $2}' | xargs rm -rf

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 contenu

Edit: 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 la awksyntaxe doit être modifiée en conséquence.

find * -maxdepth 0 -type d -not -path "current" -not -path "shared" | sort -nr | awk 'NR > 3 {print $0}' | xargs rm -rf

Référence: voir ces deux questions / réponses utiles / similaires.

simlev
la source
1
Belle solution, je ne suis pas sûr de savoir qui est le ninja ...
djsmiley2k
0

Dans sa forme la plus élémentaire

touch -t 201003160120 some_file
find . -maxdepth  0 -type d ! -newer some_file -name \*.develop.\* -delete

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.

djsmiley2k
la source
J'ai ajouté un exemple de liste à la question. Est-ce que cela aide à fournir une meilleure réponse?
mkaito
2
J'aime votre réponse, mais si j'ai bien compris, le PO demande comment conserver l'élément le plus récent de X, où X est un nombre. Il ajoute plus tard que X = 3.
simlev
Il pourrait toujours remplacer le troisième fichier, mais oui ... ce n'était pas là avant: P
djsmiley2k