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 :

Suppression des fichiers dans un repertoire avec un temps de pause automatique avec shell/Linux


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut Suppression des fichiers dans un repertoire avec un temps de pause automatique avec shell/Linux
    Bonjour à toutes et tous,

    J'ai un problème à propos de notre serveur backup. En fait, ce serveur backup contient des millions de fichiers *.dat dans un répertoire, ce dernier est presque plein en ce moment et je devrai le nettoyer mais mon souci est le suivant:

    Le serveur ne supporte qu'une suppression de 2 000 fichiers puis il lui faut une pause de 5 minutes et ainsi de suite, or qu'il s'agit des millions de fichier.

    Pourriez-vous m'aider à automatiser cette suppression de 2 000 premiers fichiers avec une pause de 5 minutes avec un script shell s'il vous plaît?

    Ce que je voudrais avoir est donc de faire un boucle de suppression des 2 000 premiers fichiers + pause 5minutes jusqu'on trouve le nom de fichier xxxxxxx.dat

    Comptant sur votre aide précieuse.

    Par avance merci,
    Cordialement,
    Tmamp

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Bonjour

    Qu'as-tu fait jusqu'ici ?

    Il n'y a aucune difficulté.

    Pour attendre 5 minutes :
    Pour extraire les 2000 premières lignes d'un fichier :
    Pour supprimer les 2000 premières lignes d'un fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '1,2000d;' fichier
    À toi de jouer
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Bonjour et merci bcp Flodelarab je vais essayer ces commandes, en fait je suis très débutant avec linux !

    Encore merci

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Flodelarab

    Comme j'ai déjà dit tout à l'heure, je suis très débutant, j'ai une question : est-ce toujours valable ces commandes pour la suppression des fichiers dans un répertoire (mais non pas suppression des lignes d'un fichier) ?


    Je voulais dire pour la commande sed

    Par avance merci!!
    Cordialement,
    Tmamp

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Bonjour,

    Déjà, pourquoi cette limite de 2000 fichiers ?

    Quelles sont les commandes que tu passes pour effacer tes fichiers et comment utilises-tu celles-ci ?

    Et sinon, comment détermines-tu ta liste de fichier à effacer ?
    Cordialement.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Si on supprime plus de 2 000 fichier, il s'agissait une alarme au serveur et ce dernier reste indisponible dans un certain temps.

    Voici la commande que j'ai fait actuellement mais c'est une suppression manuelle alors qu'il s'agit des millions de fichier à supprimer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SERVEUR:/var/back/backsave/AP/second/A # rm A0286[6-7]*
    (en orange les 2 000 fichiers)

    pour déterminer la liste des fichiers effacer, je met la commande ci-dessous en entrant dans le repertoire:

    ls -ltr | head

    et

    ls -ltr | tail

    NB: ces fichiers à effacer sont déjà déplacés dans un autre serveur et c'est le dernier nom de fichier déplacé qui sera le dernier fichier à effacer

    Cordialement,
    TMamp

  7. #7
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Ben si j'ai bien compris, tu te places dans le répertoire à nettoyer, et tu fais un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while [ "$(ls *.dat)" ]; do
        a=0
        for f in *.dat; do
            rm "$f"
            ((a++))
            if ((a==2000)); then break; fi
        done
        sleep 300
    done
    Mais le problème, c'est que si tu as 2 millions de fichiers, ça va te prendre 1000x5 min = 83,33 h !

  8. #8
    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 376
    Points
    19 376
    Par défaut
    while [ "$(ls *.dat)" ]; do est stupide; la boucle for est suffisante.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Salut Balkany,

    Je vais essayer ces codes et reviens vers vous après si ça marche ou non.

    Merciiiii bcp.

    Cordialement,
    Tojo

  10. #10
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    while [ "$(ls *.dat)" ]; do est stupide; la boucle for est suffisante.
    Certes, comme ça ça doit être mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    a=0
    for f in *.dat; do
        rm "$f"
        ((a++))
        if ((a==2000)); then
            sleep 300
            a=0
        fi
    done

  11. #11
    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 376
    Points
    19 376
    Par défaut
    oui.
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for f in *.dat
    do
       test -f "$f" && rm "$f"
       ((n<2000?++n:(n=0))) || sleep 300
    done
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Pourquoi tu rajoutes un test -f, si il sait ce que sont ses fichiers .dat ?

  13. #13
    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 376
    Points
    19 376
    Par défaut
    d'abord, parce qu'on ne sait jamais*; ensuite, parce que s'il n'y a pas de fichiers, alors "$f" sera développé littéralement en *.dat.**

    *c'est pour la même raison que je mets les développements de variables entre guillemets.
    **en bash, ça peut-être éviter en positionnant nullglob avec shopt
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Mouais, bien sur, on appelle rm pour un seul fichier à la fois...
    Cordialement.

  15. #15
    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 376
    Points
    19 376
    Par défaut
    ok, comment faire le sleep ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  16. #16
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Ben on peut toujours concaténer les noms de fichiers et n'invoquer rm qu'une fois non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    a=0
    cmd="rm"
    for f in *.dat; do
        cmd="$cmd '$f'"
        ((a++))
        if ((a==2000)); then
            eval "$cmd"
            sleep 300
            a=0
            cmd="rm"
        fi
    done
    if [ "$cmd" != "rm" ]; then eval "$cmd"; fi

  17. #17
    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 376
    Points
    19 376
    Par défaut
    beurk ! eval.
    en plus, ça ne fonctionne pas : la valeur de la variable est écrasée à chaque tour.

    non, on alimente un tableau :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for f in *.dat
    do
       test -f "$f" && ar+=( "$f" )
       if test ${#ar[*]} -eq 2000; then rm "${ar[@]}"; ar=(); sleep 300; fi
    done
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  18. #18
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Pourquoi beurk eval ? Et pourquoi ma variable est écrasée à chaque tour ?

  19. #19
    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 376
    Points
    19 376
    Par défaut
    ah, oui, d'accord, tu réutilises $cmd, je cherchais cmd+="$f".

    "eval is evil" : il interprète toutes les données en tant que commande.
    un petit malin peut toujours passer des commandes dans les données.

    il y a des choses, comme ça, dont l'usage en privé est libre, mais dont la publicité ne peut être encouragée.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  20. #20
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Bonjour à tous,

    Merci beaucoup pour votre aide précieuse!!

    ça marche bien la suppression automatique avec sleep à chaque 2000 fichier

    Encore mercii à vous tous! (Balkany, N_Bah, ...)

    Cordialement,
    TMamp

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. ouvrir des fichiers dans un repertoire
    Par Art19 dans le forum Delphi
    Réponses: 5
    Dernier message: 10/04/2007, 14h49
  2. Réponses: 2
    Dernier message: 09/11/2006, 21h06
  3. Réponses: 3
    Dernier message: 21/07/2006, 13h22
  4. Réponses: 6
    Dernier message: 26/12/2005, 00h48
  5. Lister des fichiers dans un repertoire
    Par K.othmane dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2005, 11h14

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