IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Script SH: Garder que 10 fichiers dans un dossier


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut Script SH: Garder que 10 fichiers dans un dossier
    Bonjour,

    J'ai une tâche qui crée des fichiers dans un dossiers, mais pas tout les jours, cela est aléatoire, dès fois il faut "attendre" 3 jours avant qu'un fichier apparaisse.

    J'aimerais faire un script de purge, qui va me garder que les 10 derniers fichiers dans ce dossiers et supprimer les autres.

    J'ai trouvé des scripts pour purger des fichiers "plus vieux que" mais c'est pas ce que je recherche.

    Avez-vous une idée de la commande?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Bonjour,

    oui, il y a une commande pour ce que tu veux faire : info coreutils.info
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    moi je ferai comme ça (au risque de me faire taper dessus ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls -1rt | head -n-10 | xargs -ITOTO rm TOTO
    • l'option -1 de ls permet de s'assurer d'un affichage consistant
    • l'option -t de ls demande un listing des fichiers par date de dernière modification
    • l'option -I de xargs rend la commande résistante aux espaces éventuels dans les noms de fichiers (on aurait aussi pu mettre -d'\n' à la place)

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    l'option -1 de ls permet de s'assurer d'un affichage consistant
    ce n'est pas utile : quand la sortie de ls est redirigée, elle affiche toujours un fichier par ligne.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Y a un soucis: Je plussoie la commande, mais, soit on fait un ls -t |head, soit un ls -tr|tail mais pas un ls -rt|head.
    N'est-ce pas ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    yop,

    Citation Envoyé par Flodelarab Voir le message
    Y a un soucis: Je plussoie la commande, mais, soit on fait un ls -t |head, soit un ls -tr|tail mais pas un ls -rt|head.
    N'est-ce pas ?
    en soi rien ne l'interdit
    ici c'était surtout pour conserver une cohérence pour que le PO s'y retrouve avec son 10,
    si on veut garder les 10 derniers fichiers uniquement, un ls -rt | head -n-10 est équivalent à un ls -t | tail -n+12 (il faut rajouter 2)

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Ah non non non non non non.

    J'ai vérifié le man pour ne pas dire de bêtises.
    head renvoie et renverra toujours le début d'un fichier.
    -n-10 ne veut pas dire les 10 dernières mais "toutes les premières sauf les 10 dernières".

    Or ls -rt commence par les plus vieux fichiers.

    Donc carton jaune.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    head renvoie et renverra toujours le début d'un fichier.
    oui, du coup que les fichiers soient triés par horodatage croissant et qu'on prenne n lignes en partant du haut ou qu'ils soient triés par horodatage décroissant et qu'on prenne n lignes en partant du bas, on obtient toujours la même liste de fichiers ^^

    prenons un exemple concret :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ for i in {1..9}; do touch -t 20150${i}010000 fichier_${i}; done
    $ ls -gG
    total 0
    -rw-r--r-- 1 0  1 janv.  2015 fichier_1
    -rw-r--r-- 1 0  1 févr.  2015 fichier_2
    -rw-r--r-- 1 0  1 mars   2015 fichier_3
    -rw-r--r-- 1 0  1 avr.   2015 fichier_4
    -rw-r--r-- 1 0  1 mai    2015 fichier_5
    -rw-r--r-- 1 0  1 juin   2015 fichier_6
    -rw-r--r-- 1 0  1 juil.  2015 fichier_7
    -rw-r--r-- 1 0  1 août   2015 fichier_8
    -rw-r--r-- 1 0  1 sept.  2015 fichier_9
    on a donc les fichiers 1 à 9 du plus ancien au plus récent

    on veut ne conserver que les 3 fichiers les plus récents (fichier_{7,8,9} donc), ou dit autrement on veut effacer tous les autres (fichier_{1..6}) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ ls -rt | head -n-3 | xargs
    fichier_1 fichier_2 fichier_3 fichier_4 fichier_5 fichier_6
    $ ls -t | tail -n+4 | sort | xargs
    fichier_1 fichier_2 fichier_3 fichier_4 fichier_5 fichier_6
    on ressort bien le même résultat, seul l'ordre des fichiers change, et il faut adapter le nombre pour tail, ici +4 pour "ne conserver que les 3 derniers"

    avec les différentes variations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ ls -t | head -n+3 | xargs
    fichier_9 fichier_8 fichier_7
    $ ls -t | head -n-3 | xargs
    fichier_9 fichier_8 fichier_7 fichier_6 fichier_5 fichier_4
    $ ls -t | tail -n+3 | xargs
    fichier_7 fichier_6 fichier_5 fichier_4 fichier_3 fichier_2 fichier_1
    $ ls -t | tail -n-3 | xargs
    fichier_3 fichier_2 fichier_1

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Oui. C'est moi qui déraille. Je voulais la liste des fichiers à garder alors qu'on veut la liste des fichiers à bazarder.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/02/2015, 08h47
  2. Script shell pour renommer des fichiers dans des sous répértoires
    Par ibuto dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 25/12/2013, 20h52
  3. Réponses: 1
    Dernier message: 25/10/2012, 15h40
  4. Script de renommage de fichiers dans un dossier donné
    Par johnbobby dans le forum VBScript
    Réponses: 2
    Dernier message: 24/07/2012, 16h23
  5. Script lors du dépot d'un fichier dans un dossier
    Par GruZloR dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 05/04/2007, 16h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo