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 :

Optimisation de la commande tar linux


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 44
    Par défaut Optimisation de la commande tar linux
    Bonjour,

    une question bête :
    je veux faire un tar de disons 1000 fichiers.

    Comment expliquer techniquement que faire un tar cf monfichiertar ./* (le * représentant les 1000 fichiers) est plus rapide qu'une boucle du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for fichier in $(ls)
    do
      tar rf monfichiertar ${fichier}
    done
    ??

    Cela me semble logique mais je n'ai pas d'explication (parce qu'il doit parcourir le tar et aller à la fin pour chaque ajout de nouveau fichier?)
    Merci d'avance.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour,

    avec une boucle, autant de fichiers, autant d'appel à la commande tar.
    ça prend du temps d'appeler une commande externe.


    PS :
    1- ON N'UTILISE PAS ls DANS UN SCRIPT !!!
    2- ON NE PARCOURT PAS LA SORTIE D'UNE COMMANDE AVEC UNE BOUCLE for

    1- parce que les noms de fichiers peuvent contenir des caractères qui ne seront pas protégés (espaces, alinéa...), et qui peuvent empêcher une commande de les reconnaître.
    2- parce que for itère sur les mots, pas les lignes.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 44
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    1- ON N'UTILISE PAS ls DANS UN SCRIPT !!!
    2- ON NE PARCOURT PAS LA SORTIE D'UNE COMMANDE AVEC UNE BOUCLE for

    1- parce que les noms de fichiers peuvent contenir des caractères qui ne seront pas protégés (espaces, alinéa...), et qui peuvent empêcher une commande de les reconnaître.
    2- parce que for itère sur les mots, pas les lignes.
    Je rebondis pour ma culture personnelle.
    Comment traiter un ensemble de fichiers qui se situe dans un répertoire si on ne doit pas utiliser FOR et ls ?
    Plutôt find à la place de ls?

    Merci!

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    A la place du ls, tu peux utiliser find ou stat, selon ce qui t'intéresse.
    A la place de for, tu peux utiliser la clause exec de find ou xargs.

    Exemple:
    Cette commande recherche les fichiers php qui contiennent l'expression "icones_favorites"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     find -iname '*.php' -exec grep -iH 'icones_favorites' {} \;
    idem: (non testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     find -iname '*.php' | xargs -ITT grep -iH 'icones_favorites' TT

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Comment traiter un ensemble de fichiers qui se situe dans un répertoire si on ne doit pas utiliser FOR et ls ?
    en bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    shopt -s globstar nullglob
    for f in ./**
    do
       test -f "$f" && echo "$f"
    done
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    avec une boucle, autant de fichiers, autant d'appel à la commande tar.
    ça prend du temps d'appeler une commande externe.


    PS :
    1- ON N'UTILISE PAS ls DANS UN SCRIPT !!!
    2- ON NE PARCOURT PAS LA SORTIE D'UNE COMMANDE AVEC UNE BOUCLE for

    1- parce que les noms de fichiers peuvent contenir des caractères qui ne seront pas protégés (espaces, alinéa...), et qui peuvent empêcher une commande de les reconnaître.
    2- parce que for itère sur les mots, pas les lignes.
    sans compter qu'en prime tar est à la base le TAPE ARCHIVER donc ... tout update/modif est plus long par son propre fonctionnement interne que l'archivage global... (ne serait ce que par relecture de l'index existant... en +)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 44
    Par défaut
    Alors autre question :

    Maintenant je veux lancer en même temps plusieurs scripts qui font la même chose mais sur des données différentes.

    Pour schématiser :
    le script est lancé plusieurs fois en même temps (par un nohup) avec des arguments différents à chaque fois (ce qui le dirige vers des données différentes).
    J'ai donc
    script.sh ARG1
    script.sh ARG2
    etc.
    script.sh ARGn (disons n=50)

    Chaque script lance un "tar xf" sur un ensemble de fichiers tar.
    Je pars d'un fichier texte qui liste les fichiers et je fais une boucle sur le contenu et lance un tar. Donc j'ai un tar à la fois par script, mais plusieurs tar en même temps puisque plusieurs scripts qui tournent.

    Comment optimiser cela, j'ai l'impression que j'ai des tar qui sont mis à l'état D alors que je m'attendais à qu'ils fonctionnent tous en même temps (pas de risque d'écrasement puisque les données en entrée et sortie sont différentes pour chaque script lancé) ?

    ps : pas de code car trop compliqué, j'espère avoir été clair

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Bonjour,
    nohup ne sert pas à éxecuter différents commandes en parallèle, il sert juste à ce que ton process ne reçoit de signal d'arret si tu arrête ta session.

    Donc un exemple de comment tu executes tes scripts pourrait nous aider.

    Ensuite, à un instant T, le nombre de process en running ne peut être au maximum que le même nombre de cpu que tu as sur ta machine.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 44
    Par défaut
    J'ai un script que je lance en cron, appelons-le lance_tars.sh :
    Ce script fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for argument in rep1 rep2 ... rep50
    do
    nohup ./lance_tar.sh ${argument} > resu_${argument}.log 2>&1&
    done
    Ensuite le script lance_tar.sh ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    repertoire=$1
    cd ${repertoire}
    for fichiertar in $(cat config_${repertoire}.txt)
    do
      tar xf ${fichiertar}
    done
    J'ai beaucoup schématisé mais le principe c'est ça.
    Du coup ensuite j'ai 50 scripts qui tournent en même temps.
    Je ne veux pas lancer chaque script l'un après l'autre car ça prend beaucoup de temps, les fichiers tar étant assez volumineux.

    S'il existe un moyen plus intelligent je suis preneur. J'ai fait de cette manière-là un peu par ignorance.

    Merci pour vos idées.

Discussions similaires

  1. Equivalent commande Host Linux sur Windows
    Par shadokk dans le forum Windows XP
    Réponses: 6
    Dernier message: 05/01/2011, 14h15
  2. [Système] Lancer l'invite de commande sous Linux ?
    Par haffouff dans le forum Langage
    Réponses: 3
    Dernier message: 19/05/2006, 07h38
  3. [Système] PHP & exécution d'un commande sur Linux
    Par carlos20 dans le forum Langage
    Réponses: 8
    Dernier message: 12/11/2005, 12h26
  4. En-têtes désuètes avec la commande tar ?
    Par DarkOcean dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 21/04/2005, 09h45
  5. Problème avec la commande tar
    Par R3iTt0R dans le forum Shell et commandes GNU
    Réponses: 15
    Dernier message: 01/09/2004, 10h06

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