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 :

Debian Strech : du ne donne pas les bonnes informations dans un shell


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 391
    Points : 124
    Points
    124
    Par défaut Debian Strech : du ne donne pas les bonnes informations dans un shell
    Bonjour,
    Je voudrais lancer la commande du dans un script mais ceci ne fonctionne pas avec des variables !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    commande="/usr/bin/rsync -a --delete --exclude-from=/root/exclude --progress \"/mnt/sda1/Users/srom\" 140.20.21.14:/$machine/$i/"
    echo $commande  | awk -F " " '{print $6}' | du -sh
    echo $commande  | awk -F " " '{print $6}'
    du -sh /mnt/sda1/Users/srom
    donne :
    44K
    "/mnt/sda1/Users/srom"
    77M /mnt/sda1/Users/srom
    Je n'y comprends rien. La taille normale est 77M. Si je lance la même commande dans une invite ssh "echo $commande | awk -F " " '{print $6}' | du -sh" ça fonctionne mais pas dans le shell !!

    Avez-vous une idée ? Merci

  2. #2
    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 459
    Points
    13 459
    Par défaut
    Bonjour

    Le problème est qu'un pipe est un raccourci pour la mise de la sortie de la première commande dans un fichier, puis l'injection de ce fichier dans la seconde commande.
    Comme du évalue la taille du fichier, j'ai bien peur qu'il s'intéresse au fichier temporaire.
    Et pas au contenu du fichier temporaire.

    Commentons ce résultat de console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    $ echo prout | du -sh
    6,7G    .
    $ echo /home/monuser | du -sh
    6,7G    .
    $ echo /home/monuser/travail | du -sh
    6,7G    .
    $ echo /home/monuser/Documents | du -sh
    6,7G    .
    $ echo /home/monuser/Téléchagments | du -sh
    6,7G    .
    $ du -sh /home/monuser
    25G     /home/monuser
    $ du -sh /home/monuser/travail
    6,7G    /home/monuser/travail
    $ du -sh /home/monuser/Documents
    11G     /home/monuser/Documents
    $ du -sh /home/monuser/Téléchargements
    55M     /home/monuser/Téléchargements
    $ echo /home/monuser/Téléchargements|tr '\n' '\0'| du -sh --files0-from=-
    55M     /home/monuser/Téléchargements
    $ du prout
    du: impossible d'accéder à 'prout': Aucun fichier ou dossier de ce type
    $
    Non seulement tous les premiers dossiers ne font pas 6,7G, mais en plus, "Téléchagments" n'existe même pas puisqu'il manque un "r" et un "e".
    La suite montre le résultat normal.
    Le dossier de téléchargements ne fait que 55M.

    L'option --files0-from= semble régler le problème.
    Mais l'entrée doit avoir des caractères nuls en fin de ligne. Et non des retours chariots. D'où le tr.

    Bref. Quand ta commande est faite par ssh sur un fichier temporaire, j'ai bien l'impression qu'il est capable de renvoyer n'importe quoi.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 391
    Points : 124
    Points
    124
    Par défaut
    Merci pour cette réponse détaillée mais j'ai un problème d'execution dans le shell et pas en ligne de commande

    en ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $commande  | awk -F " " '{print $6}'|tr '\n' '\0'|du -sh --files0-from=-
    ça fonctionne comme le du standrard en ligne de commande

    Dans le shell
    renvoie
    du : Impossible d'accéder à ' "/mnt/sda1/Users/srom" ' aucun fichier ou dossier de ce type /
    !!! ça rajoute ' devant !

    MErci

    PS! Ou y-a-t-il un autre moyen pour calculer la taille d'un répertoire dans un script . J'ai besoin de le faire avant l'execution du rsync et après . Faut-il passer par du perl ? Merci

  4. #4
    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 459
    Points
    13 459
    Par défaut
    Pourquoi vouloir absolument faire une conduite ?

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

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

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

    il faut nous expliquer ta démarche.
    tu synchronises un dossier local vers une machine distante, et tu mesures la taille du même dossier local avant et après la synchro ?
    il y a peu de chance qu'elle ait changé.

    il est déconseillé de mettre une commande "complexe" dans une variable en vue de l'exécuter - utilise une fonction.
    et utilise une variable pour stocker les données que tu réutilises - ici, le nom du répertoire (comme ça, pas besoin de découper).
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 391
    Points : 124
    Points
    124
    Par défaut
    non j'ai plusieurs home donc des variables et ceci s'inscrit dans un script général avec plusieurs rsync, il faut donc calculer avant pour chaque profil et ensuite .. Merci

    Tailles différentes avec les exclude et surtout panne réseau ...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    pourquoi plusieurs rsync ? t'as plusieurs destinations ? plusieurs machines sources ?

    ça semble mal pensé.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 391
    Points : 124
    Points
    124
    Par défaut
    Re,
    J'aimerais savoir comment vous faites dans un sript bash pour afficher la taille d'un répertoire donné en paramètre comme par exemple
    var="/usr/home/toto"
    et donc dans le shell
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $var|tr '\n' '\0'|du -sh --files0-from=-
    ou
    qui fonctionnent en ligne de commande et pas en shell qui renvoie une taille bidon !!!! .

    Merci pour votre aide.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    KISS!*
    à moins que j'ai raté quelque chose, ça n'a rien de compliqué !

    et Flodelarab te l'a montré dans son premier message.

    --
    * Keep It Simple Stupid!
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 391
    Points : 124
    Points
    124
    Par défaut
    oui fonctionne pas en shell

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    explicite, stp.

    dans un script ça donne quoi ?
    sur la ligne de commande, ça donne quoi ?
    dans tous les cas, tu attends que ça donne quoi ?

    --
    « qui veut tuer son chien, l'accuse d'avoir la rage. »
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    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 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Bonjour,

    du prend des paramètre et non un flux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "/mnt/....." | xargs du -sh
    Cordialement.

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Outre le fait que je plussoie les réponses déjà faites, je voudrais revenir sur ton premier message:

    Citation Envoyé par falco- Voir le message
    Bonjour,
    Je voudrais lancer la commande du dans un script mais ceci ne fonctionne pas avec des variables !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    commande="/usr/bin/rsync -a --delete --exclude-from=/root/exclude --progress "/mnt/sda1/Users/srom" 140.20.21.14:/$machine/$i/"
    echo $commande  | awk -F " " '{print $6}' | du -sh
    echo $commande  | awk -F " " '{print $6}'
    du -sh /mnt/sda1/Users/srom
    C'est vraiment une drôle d'idée de faire comme ça

    1) D'abord, les guillemets de commande="/usr/bin/rsync -a --delete --exclude-from=/root/exclude --progress "/mnt/sda1/Users/srom" 140.20.21.14:/$machine/$i/" sont bizarres. Je te rappelle que le shell ne permet pas l'imbrication de guillemets. Ici, c'est plus ou moins (pour simplifier) comme si tu disais que la variable commande doit contenir la concaténation de 3 chaines:
    - "/usr/bin/rsync -a --delete --exclude-from=/root/exclude --progress "
    - /mnt/sda1/Users/srom
    - " 140.20.21.14:/$machine/$i/"

    Les guillemets ici ne servent pas à grand-chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ a="abc def "ghi/jkl" mno pqr"
    $ echo "$a"
    abc def ghi/jkl mno pqr
    Pire! Si jamais le répertoire /mnt/sda1/Users/srom devait contenir des espaces, non seulement ça ne marcherait pas comme il me semble que tu sembles l'imaginer, mais cela produirait même une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a="abc def "ghi jkl" mno pqr"
    -bash: jkl mno pqr: command not found
    C'est quasiment comme si tu tapais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ a="abc def "ghi; jkl" mno pqr"
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ a="abc def "ghi
    jkl" mno pqr"
    (sauf que la toute première des 3 versions ne réussit même pas l'affectation de "a")

    2) Ensuite, ça me paraît très capillotracté de créer une commande et d'en extraire un bout (avec "awk") pour trouver le répertoire concerné
    Il me semblerait beaucoup plus judicieux, simple, pratique, élégant et sûr (KISS!) de faire quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dir="/mnt/sda1/Users/srom"
    du -sh "$dir"
    /usr/bin/rsync -a --delete --exclude-from=/root/exclude --progress "$dir" 140.20.21.14:/$machine/$i/
    du -sh "$dir"
    Si tu as plusieurs répertoires à traiter, tu peux même faire une boucle comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    dir1="/mnt/sda1/Users/srom"
    dir2="/autre repertoire/avec peut-etre des espaces"
    for dir in "$dir1" "dir2"
    do
      du -sh "$dir"
      /usr/bin/rsync -a --delete --exclude-from=/root/exclude --progress "$dir" 140.20.21.14:/$machine/$i/
      du -sh "$dir"
    done

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 391
    Points : 124
    Points
    124
    Par défaut
    Merci comme Flodelarab de cette réponse d'expert.

    Cependant j'ai corrigé dans le premier post, c'est une erreur de ma part il y a des \ devant les " . Vous avez raison pour l'imbrication de chaines ..

    Cependant je suis obligé de faire de la sorte pour le awk car les répertoires sont variables (comme le nom de l'user ici srom) et là j'ai cité une partie du script.

    Ma question est toujours la même et semble sans réponse comme la dit Flodelarab ,problème de du dans script shell ...

    Je vous redit dans un shell ne fonctionne pas ou donne des résultats erronés .

    Mon besoin assez simple ! :
    Faire en sorte de tester les fichiers du rsyn avant et après. Une fois tous les 15 jours ou presque nous avons un problème de rsync -> les répertoires sont créés mais pas les fichiers ... Donc je rajoute ceci dans le code pour que l'utilisateur soit averti d'une grosse différence lors du rsync. Vous allez me dire de faire un diff ou autre chose mais pas possible ici.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    commande="/usr/bin/rsync -a --delete --exclude-from=/root/exclude --progress \"/mnt/sda1/Users/srom\" 140.20.21.14:/$machine/$i/"
    echo $commande  | awk -F " " '{print $6}' | du -sh
    ou
    echo $commande  | awk -F " " '{print $6}'| du -sh --files0-from=-

    Je précise que si je tape toutes ces commandes en ligne de commande c'est ok


    Je suis en train de voir comment le faire avec find et wc !!!!!!!!

  15. #15
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 731
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 731
    Points : 15 136
    Points
    15 136
    Par défaut
    Salut,
    Citation Envoyé par falco- Voir le message
    Je vous redis dans un shell ne fonctionne pas ou donne des résultats erronés .
    Chez moi ça fonctionne très bien, je viens de faire le test en copiant/collant les deux lignes (juste adapté le chemin) de
    Citation Envoyé par jack-ft Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dir="/mnt/sda1/Users/srom"
    du -sh "$dir"
    Résultat identique en console comme en script.

    Mais bon, tout ça c'est pour "cacher la m3rd3 au chat", comme on dit, car ton vrai et gros problème il est là :
    Citation Envoyé par falco- Voir le message
    Une fois tous les 15 jours ou presque nous avons un problème de rsync -> les répertoires sont créés mais pas les fichiers ... Donc je rajoute ceci dans le code pour que l'utilisateur soit averti d'une grosse différence lors du rsync.
    et j'adore cette manière (d'essayer) de l'évacuer sans le régler et en tentant de le contourner : ça revient à laisser derrière soi une grenade dégoupillée posée en équilibre sur une frêle branche d'arbre sensible au vent...
    Du grand n'importe quoi.

    Bon sang, on ne joue pas avec les sauvegardes, c'est un process qui doit être béton de chez béton, alors essaye de savoir pourquoi des fois ça échoue, au lieu de prévenir l'utilisateur que ça a échoué !
    Insensé, ça !
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  16. #16
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    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 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Alors là, tu fais fausse route car cette commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $commande  | awk -F " " '{print $6}' | du -sh
    ne fait pas du tout un du du $6 de awk mais un du du répertoire courant.

    Comme je l'ai déjà dis, du prend des paramètres et non un flux, si tu préfères, la commande du se comporte comme la commande ls.

    Si tu veux que ta commande fonctionne, la bonne syntaxe est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $commande  | awk -F " " '{print $6}' | xargs du -sh
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    je suis obligé de faire de la sorte pour le awk car les répertoires sont variables (comme le nom de l'user ici srom)
    c'est aussi à ça que servent les fonctions : elles permettent une forme de modularité en prenant des arguments (comme un script).
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 391
    Points : 124
    Points
    124
    Par défaut
    re,
    je tiens à remercier Flodelarab et plus particulièrement disedorgue qui m'avait déjà donné la solution mais noyée dans le reste !

    Merci à tous pour votre collaboration et à bientôt

    PS : que certains se rassurent cette solution est provisoire en attendant de localiser le pb aléatoire de rsync

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2002] Formulaire ne passe pas les bonnes données à une requête
    Par badge234 dans le forum Access
    Réponses: 3
    Dernier message: 01/07/2015, 18h19
  2. [MySQL-5.5] LEFT JOIN avec MAX qui ne me retourne pas les bonnes données
    Par Gloup dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/05/2014, 17h26
  3. Réponses: 4
    Dernier message: 04/03/2012, 14h29
  4. site: donne pas les vrais résultats dans google
    Par kaayna dans le forum Référencement
    Réponses: 1
    Dernier message: 21/04/2010, 12h53
  5. [SQL] Pb Mysql n'insert pas les bonnes valeur dans la bdd
    Par potao dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 11/02/2007, 03h12

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