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 :

Erreur avec diff contenant des valeurs entre guillemets


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de marcoxavier
    Homme Profil pro
    ADMINISTRATEUR SYSTEME UNIX
    Inscrit en
    Mai 2015
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : ADMINISTRATEUR SYSTEME UNIX

    Informations forums :
    Inscription : Mai 2015
    Messages : 72
    Par défaut Erreur avec diff contenant des valeurs entre guillemets
    Bonjour,

    j'ai fais un petit script shell pour faire le listing des fichiers d'un répertoire et le comparer à tous les fichiers de 2 autres répertoire, afin de vérifier s'il trouve 2 fichiers identiques.

    Voici mon script:

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #!/bin/bash
     
    files1=()
    files2=()
     
    # Directories to compare. Adding quotes at the begining and at the end of each files found in content1 & content3
     
    content2=$(find /data/logs -name "*.log" -type f)
    content1=$(find /data/other/logs1 -type f | sed 's/^/"/g' | sed 's/$/"/g')
    content3=$(find /data/other/logs2 -type f | sed 's/^/"/g' | sed 's/$/"/g')
     
    # ADDING CONTENT INTO FILES1 & FILES2 ARRAY
    while read -r line; do
            files1+=("$line")
    done <<< "$content1"
     
    # content1 and content3 goes into the same array
    while read -r line3;do
            files1+=("$line3")
    done <<< "$content3"
     
    while read -r line2; do
            files2+=("$line2")
    done <<< "$content2"
     
     
    # Here i'm trying to compare 1 by 1 the files in files2 to all files1
    for ((i=0; i<${#files2[@]}; i++))
    do
            for ((j=0; j<${#files1[@]}; j++))
            do
                    if [[ -n ${files2[$i]} ]];then
                            diff -s "${files2[$i]}" "${files1[$j]}" > /dev/null
                            if [[ $? == 0 ]]; then
                                    echo ${files1[$j]} "est identique a" ${files2[$i]}
                                    unset 'files2[$i]'
                                    break
                            fi
                    fi
            done
    done
     
    #SHOW THE FILES THAT DIDN'T MATCHED ANYTHING
    echo ${files2[@]}
    J'ai l'erreur suivante : diff: "/data/content3/other/log2/perso log/somelog.log": Aucun fichier ou dossier de ce type

    Pourtant le fichier existe quand je fait un ls sur le même chemin:

    ll "/data/content3/other/log2/perso log/somelog.log"
    -rw-rw-r-- 2 lopom lopom 551M 30 oct. 18:53 '/data/content3/other/logs2/perso log/somelog.log'

    J'ai selon moi besoin des guillements car dans certains chemins il peut y avoir des espaces, et diff l'interprète mal.

    J'ai essayé de mettre les valeurs dans les tableaux avec des simples guillemets mais ca ne résous pas le problème.

    J'espère avoir été assez compréhensible, je reste disponible si vous avez des questions.

    Merci par avance

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 332
    Par défaut
    bonjour
    Citation Envoyé par marcoxavier Voir le message
    J'ai l'erreur suivante : diff: "/data/content3/other/log2/perso log/somelog.log": Aucun fichier ou dossier de ce type
    Pourtant le fichier existe
    En fait existe le fichier /data/content3/other/log2/perso log/somelog.log mais pas "/data/content3/other/log2/perso log/somelog.log"Il faut donc juste supprimer les sed avec le find

  3. #3
    Membre confirmé Avatar de marcoxavier
    Homme Profil pro
    ADMINISTRATEUR SYSTEME UNIX
    Inscrit en
    Mai 2015
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : ADMINISTRATEUR SYSTEME UNIX

    Informations forums :
    Inscription : Mai 2015
    Messages : 72
    Par défaut
    Citation Envoyé par papajoker Voir le message
    bonjour

    En fait existe le fichier /data/content3/other/log2/perso log/somelog.log mais pas "/data/content3/other/log2/perso log/somelog.log"Il faut donc juste supprimer les sed avec le find
    Hello,

    Merci de ta réponse, mais dans ce cas comment je fais pour pas que l'espacement dans le chemin du fichier pose problème lors du diff ? Parce que du coup sans les guillements il m'interprète l'espace comme une valeur à comparer.
    Ca me sort l'erreur :

    diff: opérande supplémentaire « log/somelog.log »

  4. #4
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Pas de variable, lecture directe avec séparateur nul :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while IFS='' read -r -d '' line; dodone < <(find /data/other/logs1 -type f -print0)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 717
    Par défaut
    • l'initialisation des tableau n'est pas utile
    • pourquoi stocker les données dans des variables "plates" pour ensuite les mettre dans un tableau ?!
    • le parcours du deuxième tableau autant de fois qu'il y a d'éléments dans le premier peut prendre énormément de temps.
    • Rappel : la structure de [if] c'est if COMMANDES; then COMMANDES; [ elif COMMANDES; then COMMANDES; ]... [ else COMMANDES; ] fi, donc, tester la valeur de retour d'une commande qui vient d'être exécutée est un non-sens.
    • unset 'tableau[$indice]' va continuellement supprimer le premier élément du tableau, parce que $indice ne sera développé entre des apostrophes !



    pourquoi ne pas parcourir l'arborescence du premier répertoire, et tester l'existence et la similitude du fichier correspondant dans le second répertoire ?
    il faut nous en dire plus sur la profondeur des répertoires.

  6. #6
    Membre confirmé Avatar de marcoxavier
    Homme Profil pro
    ADMINISTRATEUR SYSTEME UNIX
    Inscrit en
    Mai 2015
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : ADMINISTRATEUR SYSTEME UNIX

    Informations forums :
    Inscription : Mai 2015
    Messages : 72
    Par défaut
    Bonjour,

    Merci de vos réponse.
    Pour te répondre N_BaH point par point :

    - l'initialisation des tableau n'est pas utile
    - pourquoi stocker les données dans des variables "plates" pour ensuite les mettre dans un tableau ?!

    Pour ces deux points je ne suis pas encore passé sur la relecture et l'optimisation du script, effectivement c'est à revoir.

    - Le parcours du deuxième tableau autant de fois qu'il y a d'éléments dans le premier peut prendre énormément de temps.

    C'est vrai mais ce n'est pas un problème pour l'utilisation que je vais en faire, après si tu as une solution pour optimiser le temps de traitement je suis preneur.

    - Rappel : la structure de [if] c'est if COMMANDES; then COMMANDES; [ elif COMMANDES; then COMMANDES; ]... [ else COMMANDES; ] fi, donc, tester la valeur de retour d'une commande qui vient d'être exécutée est un non-sens.

    Je suppose que tu parle de cette ligne : if [[ -n ${files2[$i]} ]]

    Effectivement dans une ancienne version du script ca posait problème de ne pas le mettre, mais je peux le retirer.

    unset 'tableau[$indice]' va continuellement supprimer le premier élément du tableau, parce que $indice ne sera développé entre des apostrophes !

    Je ne vois pas ce que tu veux dire par la, si tu peux développer ?

    pourquoi ne pas parcourir l'arborescence du premier répertoire, et tester l'existence et la similitude du fichier correspondant dans le second répertoire ?

    Alors pour être plus précis, j'utilise diff car le nom des fichiers n'est pas le même entre les 2 répertoires. Ensuite il existe beaucoup de sous dossier, l'arborescence pour un même fichier n'est pas identique dans les 2 répertoires. Justement la double boucle for, me permet de tester s'il existe 2 fichiers identiques dans ces deux répertoires, ce que je ne sais pas en avance.
    Le find -type f lui prend tous les fichiers du dossier que je lui donne y compris les sous dossier.

    En fait je ne suis pas sur de comprendre ce que tu entends pas la, car c'est déjà ce que je fais ? Je prend le fichier 1 et je regarde s'il existe un même fichier dans l'autre répertoire.

    J'espère que j'aurai été assez clair :s ?

    Merci encore.

  7. #7
    Membre confirmé Avatar de marcoxavier
    Homme Profil pro
    ADMINISTRATEUR SYSTEME UNIX
    Inscrit en
    Mai 2015
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : ADMINISTRATEUR SYSTEME UNIX

    Informations forums :
    Inscription : Mai 2015
    Messages : 72
    Par défaut
    Citation Envoyé par balkany Voir le message
    Pas de variable, lecture directe avec séparateur nul :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while IFS='' read -r -d '' line; dodone < <(find /data/other/logs1 -type f -print0)
    C'est une possibilité mais je ne pense pas que cela règle le problème du diff

  8. #8
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Si, tes noms de fichier seront correctement protégés.

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par marcoxavier Voir le message
    Voici mon script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    ...
                    if [[ -n ${files2[$i]} ]];then
                            diff -s "${files2[$i]}" "${files1[$j]}" > /dev/null
                            if [[ $? == 0 ]]; then
    Citation Envoyé par N_BaH Voir le message
    • Rappel : la structure de [if] c'est if COMMANDES; then COMMANDES; [ elif COMMANDES; then COMMANDES; ]... [ else COMMANDES; ] fi, donc, tester la valeur de retour d'une commande qui vient d'être exécutée est un non-sens.

    Ce que j'imagine que veut dire N_BaH, c'est que tu peux remplacer ce code par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    ...
                    if test -n "${files2[$i]}"; then
                            if diff -s "${files2[$i]}" "${files1[$j]}" > /dev/null
                            then
    d'ailleurs, si tu veux juste comparer 2 fichiers sans réellement te préoccuper des différences, il est probablement beaucoup plus efficace d'utiliser cmp, car son algorithme est bôôôôcoup plus simple et, entre autres, il arrête la comparaison à la première différence trouvée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    ...
                    if test -n "${files2[$i]}"; then
                            if cmp -s "${files2[$i]}" "${files1[$j]}"
                            then

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 717
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Ce que j'imagine que veut dire N_BaH, c'est que tu peux remplacer ce code par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    ...
                    if test -n "${files2[$i]}"; then
                            if diff -s "${files2[$i]}" "${files1[$j]}" > /dev/null
                            then
    non, non.
    ce dont je parle, c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    diff -s "${files2[$i]}" "${files1[$j]}" > /dev/null
    if [[ $? == 0 ]]
    qui devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if diff -s "${files2[$i]}" "${files1[$j]}" > /dev/null; then... fi
    Citation Envoyé par papjoker
    j'ai de gros doutes avec "diff -r"
    Citation Envoyé par marcoxavier
    j'utilise diff car le nom des fichiers n'est pas le même entre les 2 répertoires.
    Donc ici on compare toto.txt avec tata.txt ? "diff -r" ne le fait pas
    évidemment !


    EDIT : puisque tu n'utilises pas de bornes, for ((i=0; i<${#files2[@]}; i++)) peut être remplacé par for i in ${!files2[*]}; pareil pour j.

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

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

    Pourquoi un test étendu if [[ $present == "no" ]]; then, quand un test simple suffit ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if [ "$present" = "no" ]
    then

  12. #12
    Membre confirmé Avatar de marcoxavier
    Homme Profil pro
    ADMINISTRATEUR SYSTEME UNIX
    Inscrit en
    Mai 2015
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : ADMINISTRATEUR SYSTEME UNIX

    Informations forums :
    Inscription : Mai 2015
    Messages : 72
    Par défaut
    Effectivement je l'ai corrigé, et d'autres chose d'ailleurs, que je n'ai pas reposté depuis.
    Par exemple j'ai mis mon diff dans une condition IF comme me l'a préconisé N_BaH plus tôt dans la discution, je n'ai simplement pas posté le script à jour. Néanmoins celui que j'ai mis fonctionne, il y juste quelques petites améliorations à faire

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par marcoxavier Voir le message
    j'ai mis mon diff dans une condition IF comme me l'a préconisé N_BaH plus tôt dans la discution
    Et ma préconisation de remplacer diff par cmp ?

    cmp fait une très simple comparaison byte par byte et sort dès qu'un byte diffère.

    diff, lorsqu'il trouve des différences, essaie de trouver des morceaux qui se ressemblent, en comparant diverses lignes en avant et en arrière (grosso modo).
    Il est prévu pour afficher une visualisation lisible par un humain (ou pour générer de quoi faire un merge).

    Il me semble que cmp répond mieux à ton besoin que diff, non ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 717
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Pourquoi un test étendu if [[ $present == "no" ]]; then, quand un test simple suffit ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if [ "$present" = "no" ]
    then
    voire un simple test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if test "$present" = 'no'

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    non, non.
    [chipotage]J'aurais préféré un "non, oui" plutôt qu'un "non, non" ;-)

    J'ai voulu faire vite... je ne voulais pas dire que tu préconisais if test...,

    mais, pour la ligne suivante if diff..., je ne vois pas de différence entre nos codes.

    [/chipotage]

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

Discussions similaires

  1. [MySQL] problème avec la récupération des valeurs des variables POST
    Par Jasmine80 dans le forum PHP & Base de données
    Réponses: 20
    Dernier message: 11/05/2007, 17h08
  2. [SqlServer 2K] curseurs avec SELECT contenant des variables
    Par yinyang dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2006, 11h25
  3. Import avec fichier contenant des guillemets
    Par Maximus06 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/07/2006, 13h07
  4. Réponses: 18
    Dernier message: 28/04/2006, 12h00
  5. souci avec le format des valeurs numériques.
    Par LESOLEIL dans le forum Langage
    Réponses: 9
    Dernier message: 05/04/2006, 17h12

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