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

Linux Discussion :

Utiliser variable(=liste de fichiers avec espaces)


Sujet :

Linux

  1. #1
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut Utiliser variable(=liste de fichiers avec espaces)
    Bonjour.

    voici le fichier de données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    root@samba-eu:/home/user # cat test
    /partages/commun/.recycle/Nouveau Texte seulement.txt:/partages/commun/.recycle/TESTDIR.TMP:
    Je vous jette ce qui me gêne :
    je veux utiliser clamscan pour scanner des fichiers. J'ai sélectionné ces fichiers selon certains critères...

    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
    root@samba-eu:/home/user # sed 's/\ /\\\ /g' test | tr : ' '
    /partages/commun/.recycle/Nouveau\ Texte\ seulement.txt /partages/commun/.recycle/TESTDIR.TMP
    root@samba-eu:/home/user # clamscan `sed 's/\ /\\\ /g' test | tr : ' '`
    ERROR: Can't access file /partages/commun/.recycle/Nouveau\
    /partages/commun/.recycle/Nouveau\: No such file or directory
    ERROR: Can't access file Texte\
    Texte\: No such file or directory
    ERROR: Can't access file seulement.txt
    seulement.txt: No such file or directory
    /partages/commun/.recycle/TESTDIR.TMP: Empty file.
     
    ----------- SCAN SUMMARY -----------
    Known viruses: 32526
    Scanned directories: 0
    Scanned files: 0
    Infected files: 0
    Data scanned: 0.00 MB
    I/O buffer size: 131072 bytes
    Time: 0.458 sec (0 m 0 s)
    root@samba-eu:/home/user # clamscan /partages/commun/.recycle/Nouveau\ Texte\ seulement.txt /partages/commun/.recycle/TESTDIR.TMP
    /partages/commun/.recycle/Nouveau Texte seulement.txt: Empty file.
    /partages/commun/.recycle/TESTDIR.TMP: Empty file.
     
    ----------- SCAN SUMMARY -----------
    Known viruses: 32526
    Scanned directories: 0
    Scanned files: 0
    Infected files: 0
    Data scanned: 0.00 MB
    I/O buffer size: 131072 bytes
    Time: 0.456 sec (0 m 0 s)
    ou pour simplifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    root@samba-eu:/home/userr # sed 's/\ /\\\ /g' test | tr : ' '
    /partages/commun/.recycle/Nouveau\ Texte\ seulement.txt /partages/commun/.recycle/TESTDIR.TMP
    root@samba-eu:/home/user # clamscan `sed 's/\ /\\\ /g' test | tr : ' '`
    Echec
    root@samba-eu:/home/user # clamscan /partages/commun/.recycle/Nouveau\ Texte\ seulement.txt 
    Réussite
    en gros, j'ai un fichier dans lequel j'ai des noms de fichiers.
    Je le formatte à la main et je copie le résultat en ligen de commande, ça fonctionne.
    Mais si je formatte en ligne de commande, ça plante.

    je ne comprends pas du tout

    Si quelqu'un a une explication, je suis preneur.

    merci d'avance.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  2. #2
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    on peut reproduire le problème plus simplement ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    touch a\ a
    touch b\ b
    ls a\ a b\ b
    <<fonctionne>>
    plouf="a\ a b\ b"
    ls $plouf
    <<fonctionne pas>>
    edit: je vois bien une solution de fortune en remplaçant les espaces par des caractères wildcard ? mais c'est bidouillatoire et je risque de scanner plusieurs fois le même fichier...
    ça m'étonne de n'avoir jamais recontré ce problème
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  3. #3
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    bonjour,
    Si j'ai bien compris tu as des rpoblème avec les noms de fichiers ayant des espaces ?

    Bon je me lance peut être que ça pourra t'aider (à moins que je n'ai vraiment rien compris ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    touch a\ a
    fch="a a"
    ls -l "$fch"
    Il faut mettre la variable contenant le nom du fichier entre quote sinon ls crois qu'il y a deux paramètres.

  4. #4
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    en fait j'essayais de mettre des backslash devant les espaces mais c'est mauvais.

    Il faut entourer chaque nom de fichier qui contient potentiellement un espace de guillemets(double quote pour les intimes.

    ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    root@samba-eu:/home/user # ls "a\ a b\ b"
    ls: a\ a b\ b: Aucun fichier ou répertoire de ce type
    root@samba-eu:/home/user # ls "a a b b"
    ls: a a b b: Aucun fichier ou répertoire de ce type
    root@samba-eu:/home/user # ls "a a" "b b"
    a a  b b
    je n'ai pas eu le réflexe de jouer avec les quotes, double quote etc...
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  5. #5
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    oui mais non ...

    cela fonctionne pour un cas simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    touch a\ a
    fch="a a"
    ls -l "$fch"
    mais si j'ai dans fch a a et b b ?
    comment faire ?

    je cherche ...
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  6. #6
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    J'ai pas trop compris ton problème mais j'ai ça comme idée :
    J'ai essayé en script bash et chez moi ça me trouve bien uniquement les fichiers avec un nom contenant au minimum un espace.
    En espérant avoir pu t'aider
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  7. #7
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    root@samba-eu:/home/user # touch a b
    root@samba-eu:/home/user # aze="a b"
    root@samba-eu:/home/user # ls $aze
    a  b
    on a 2 fichiers simples, ça marche sans problème, même pas besoin des double quote

    maintenant

    on essaie avec des noms de fichier avec espaces...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    root@samba-eu:/home/user # aze="a a b b"
    root@samba-eu:/home/user # ls "$aze"
    ls: a a b b: Aucun fichier ou répertoire de ce type
    root@samba-eu:/home/user # aze="a\ a b\ b"
    root@samba-eu:/home/user # ls "$aze"
    ls: a\ a b\ b: Aucun fichier ou répertoire de ce type
    root@samba-eu:/home/user # aze="a\ a\"\ \"b\ b"
    root@samba-eu:/home/user # ls "$aze"
    ls: a\ a"\ "b\ b: Aucun fichier ou répertoire de ce type
    on rigole déjà nettement moins.

    Il me manque encore une subtilité
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  8. #8
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Citation Envoyé par le mage tophinus
    J'ai pas trop compris ton problème mais j'ai ça comme idée :
    J'ai essayé en script bash et chez moi ça me trouve bien uniquement les fichiers avec un nom contenant au minimum un espace.
    En espérant avoir pu t'aider
    Tout d'abord : merci d'essayer edit: de m'aider

    Je ne cherche pas à trouver les noms de fichiers contenant des espaces.
    ls n'a pas d'importance ici.

    Ce que je veux c'est lister des noms(pouvant contenir des espaces) dans une variable (ou un fichier, ça donne le même problème).
    Puis je veux utiliser cette variable comme paramètre à une commande quelconque (pour faire simple j'ai choisi ls, mais tu peux voir que dans mon message original, c'est clamscan qui est utilisé).
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  9. #9
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    Apparemment ton fichier 'test' contient la liste des fichierss séparés par ':' Donc voici une commande qui utilise awk pour séparer les nom des fichiers (le séparateur est soit ':' soit '\n'), puis je passe le résultat à xargs en oubliant pas d'entourer le nom des fichier par '"' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     awk 'BEGIN{RS="[:\n]"} {print "\"" $0 "\""}' listefichier.txt | xargs -n1 ls -l

    BEGIN{RS="[:\n]"} : je défini le séparateur d'enregistrement à ':' ou '\n'
    {print "\"" $0 "\""}' : je récupère l'enregistrement que j'insère entre 2 "

    xargs -n1 ls -l : j'utilise xargs pour paser chaque ligne recu comme un paramètre pour la commande ls


    et voilou

  10. #10
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Je crois que j'ai trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    touch "a a"
     
    #!/bin/bash
    aze="a"\ "a"
    ls "$aze"
     
    toph@pcfixe:~/temp$ ./space.sh
    a a
    En fait il faudrait sortir l'espace des guillemets mais d'où vient le problème, là j'en sais rien.

    Autre problème avec cette formule, il faut avoir le nom précis du fichier. Parce que j'ai essayé ça :
    Pour qu'il me trouve le fichier "Firewall Builder.pdf" et il me met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ls: l B: Aucun fichier ou répertoire de ce type
    là je suis bloqué ....
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  11. #11
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Citation Envoyé par narmataru
    Apparemment ton fichier 'test' contient la liste des fichierss séparés par ':' Donc voici une commande qui utilise awk pour séparer les nom des fichiers (le séparateur est soit ':' soit '\n'), puis je passe le résultat à xargs en oubliant pas d'entourer le nom des fichier par '"' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     awk 'BEGIN{RS="[:\n]"} {print "\"" $0 "\""}' listefichier.txt | xargs -n1 ls -l

    BEGIN{RS="[:\n]"} : je défini le séparateur d'enregistrement à ':' ou '\n'
    {print "\"" $0 "\""}' : je récupère l'enregistrement que j'insère entre 2 "

    xargs -n1 ls -l : j'utilise xargs pour paser chaque ligne recu comme un paramètre pour la commande ls


    et voilou
    j'ai essayé, je crois pas que ça change quoi que ce soit.

    edit: si ça m'a l'air bien en fait ...
    je vérifie et je te dis quoi
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  12. #12
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    le mage tophinus : meuh non

    f="a"\ "a" est équivalent à f="a a"
    et donc ls $f marche très bien dans les 2 cas.

    Ton problème est que tu passe à ls une variable contenant "a a b b" et évidemment ce fichier n'existe pas
    Ce n'est pas l'espace qui gène mais bel et bien le fait que tu passe un nom defichier inexistant

    ls "a a b b" != ls "a a" "b b"

  13. #13
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    Citation Envoyé par ggnore
    Citation Envoyé par narmataru
    Apparemment ton fichier 'test' contient la liste des fichierss séparés par ':' Donc voici une commande qui utilise awk pour séparer les nom des fichiers (le séparateur est soit ':' soit '\n'), puis je passe le résultat à xargs en oubliant pas d'entourer le nom des fichier par '"' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     awk 'BEGIN{RS="[:\n]"} {print "\"" $0 "\""}' listefichier.txt | xargs -n1 ls -l

    BEGIN{RS="[:\n]"} : je défini le séparateur d'enregistrement à ':' ou '\n'
    {print "\"" $0 "\""}' : je récupère l'enregistrement que j'insère entre 2 "

    xargs -n1 ls -l : j'utilise xargs pour paser chaque ligne recu comme un paramètre pour la commande ls


    et voilou
    j'ai essayé, je crois pas que ça change quoi que ce soit.
    chez moi ça marche nickel

    yves@yves:/tmp/toto$ awk 'BEGIN{RS="[:\n]"} {print "\"" $0 "\""}' tt | xargs -n1 ls -l
    ls: /partages/commun/.recycle/Nouveau Texte seulement.txt: Aucun fichier ou répertoire de ce type
    ls: /partages/commun/.recycle/TESTDIR.TMP: Aucun fichier ou répertoire de ce type
    -rw-r--r-- 1 yves yves 0 2005-04-07 08:38 a a
    -rw-r--r-- 1 yves yves 0 2005-04-07 08:38 b b
    dans le fichier tt :
    yves@yves:/tmp/toto$ cat tt
    /partages/commun/.recycle/Nouveau Texte seulement.txt:/partages/commun/.recycle/TESTDIR.TMP:a a:b b:
    si ce n'est pas ça que tu veux j'ai rien compris

  14. #14
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    j'ai honte En plus je l'avais vu la différence entre "a a b b" et "a a" "b b" et puis à l'origine j'avais pas fait les tests sur ce fichier là. Evidemment, j'ai encore été trop vite ....

    narmataru : je crois que t'as la solution parce que j'ai essayé chez moi et ça marche aussi...
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  15. #15
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    en fait, non ça ne va pas...

    il ne faut pas que ls soit lancé pour chaque fichier, mais plutôt que ls soit lancé une fois pour tous les fichiers

    il faut que j'ai le même résultat que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    root@samba-eu:/home/user # ls "a a" "b b"
    a a  b b
    et non pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    root@samba-eu:/home/user # awk 'BEGIN{RS="[:\n]"} {print "\"" $0 "\""}' test.txt | xargs -n1 ls
    a a
    b b

    dans ta commande, ls est lancé 2 fois...
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  16. #16
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    ha ben voui

    aller hop ! on passe à sed

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "s/:/\" \"/g" tt| sed -r -e "s/(.*)/\"\1\"/"|xargs -p ls -l
    sed -e "s/:/\" \"/g" : je remplace tous les ':' par '" "'
    sed -r -e "s/(.*)/\"\1\"/" : je récupère la ligne entière et je place une guillement '"' devant et derrière.

    yves@yves:/tmp/toto$ sed -e "s/:/\" \"/g" tt| sed -r -e "s/(.*)/\"\1\"/"|xargs -p ls -l
    ls -l /partages/commun/.recycle/Nouveau Texte seulement.txt /partages/commun/.recycle/TESTDIR.TMP a a b b ?...y
    ls: /partages/commun/.recycle/Nouveau Texte seulement.txt: Aucun fichier ou répertoire de ce type
    ls: /partages/commun/.recycle/TESTDIR.TMP: Aucun fichier ou répertoire de ce type
    -rw-r--r-- 1 yves yves 0 2005-04-07 08:38 a a
    -rw-r--r-- 1 yves yves 0 2005-04-07 08:38 b b

  17. #17
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    nickel chrome.
    t'es un chef.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

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

Discussions similaires

  1. [système]shell + Nom de fichier avec Espace
    Par delphine_lep dans le forum Access
    Réponses: 3
    Dernier message: 23/03/2007, 16h24
  2. Réponses: 46
    Dernier message: 14/03/2007, 17h47
  3. Concaténation et MAJ d'un fichier avec espaces
    Par Papillon00 dans le forum Access
    Réponses: 4
    Dernier message: 05/12/2006, 22h38
  4. Utilisation des liste liées (ajax) avec du perl
    Par Jim_Nastiq dans le forum Web
    Réponses: 1
    Dernier message: 12/07/2006, 12h07
  5. download fichier avec espace dans le nom
    Par cb68 dans le forum Langage
    Réponses: 8
    Dernier message: 23/11/2005, 10h00

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