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 :

liste=`ls` ne fonctionne pas avec espaces


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Septembre 2019
    Messages : 11
    Par défaut liste=`ls` ne fonctionne pas avec espaces
    Bonjour

    La commande liste=`ls` ne fonctionne pas avec des espaces dans les noms de fichiers. Les espaces sont considérés comme des séparateurs de noms de fichiers. Existe-il une autre commande pour récupérer la liste des fichiers d'un répertoire dans une variable..... ?

    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Par défaut
    Bonjour,

    Essaye:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ IFS='\n'
    $ for f in $(ls); do echo $f; done

  3. #3
    Membre régulier
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Septembre 2019
    Messages : 11
    Par défaut
    Ça marche. Merci !

  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
    ls fonctionne avec tous les noms de fichiers, c'est la récupération de sa sortie qui fonctionne mal, car ce n'est pas fait pour.
    Pour récupérer la liste des fichiers non cachés du répertoire courant dans un tableau, tu peux faire
    Si tu veux en plus les fichiers cachés, avant la précédente commande, tu fais

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

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

    C'est de la mauvaise programmation.
    Les `backticks` sont obsolètes. Il faut utiliser $( ).
    On utilise pas ls dans un script.
    Les alternatives à ls sont find pour trouver les fichiers et stat pour avoir les caractéristiques des fichiers.

    Ensuite, soit tu traites directement ton fichier dans l'option -exec du find; soit tu utilises xargs dans une conduite (pipe); soit tu alimentes une boucle while avec la liste des fichiers.

  6. #6
    Membre régulier
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Septembre 2019
    Messages : 11
    Par défaut
    re

    utiliser IFS='\n' fonctionne .... partiellement.

    contexte : j'ai un script qui fait en gros liste=$(ls) for f in liste .....etc
    J'ai déposé ce script sur une machine distante par ssh. Lorsque je l'exécute à partir de ma machine avec IFS='\' il fonctionne parfaitement (même si c'est de la mauvaise programmation).
    Par contre si je vais sur la machine distante
    1) il ne démarre pas du bureau (qui es son emplacement)
    2) il fonctionne correctement si je le lance en ligne de commande
    3) il déraille si je le lance à partir de l'explorateur de fichiers en coupant les noms aléatoirement

    J'imagine que la variable IFS à quelque chose à voir la dedans.....

    Si vous avez une idée....

  7. #7
    Invité
    Invité(e)
    Par défaut
    non, on n'utilise pas ls dans une substitution de commande, pour itérer dans une boucle, ni dans un script, à cause des difficultés dans lesquels tu entres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in *; do echo ">$f<"; done
    c'est aussi simple.

  8. #8
    Membre régulier
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Septembre 2019
    Messages : 11
    Par défaut
    re

    J'ai vraiment un gros problème avec le shell. Quelqu'un pourrait-il m'expliquer pourquoi le script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IFS=$'\n'
    for f in *
        do echo $(find $f -maxdepth 1 -prune -type f ) 
    done

    fonctionne parfaitement si je le copie dans un terminal ...et ne fonctionne pas si je lance le script ?

    J'ai oublié de préciser que sans le IFS=$'\n' ça ne marche ni dans un cas ni dans l'autre....

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 308
    Par défaut
    for f in *
    do echo $(find $f -maxdepth 1 -prune -type f )
    pfffff

    Quel est le sens d'un script où on demande de chercher une fois avoir sélectionné tous les fichiers ou dossiers d'un répertoire courant ?

    si je lance le script
    Que veut dire "lancer un script". Que fais-tu concrètement ? Avec quels fichiers ? Quel contexte ? Avec les droits pour le faire ?

    ne fonctionne pas
    Que veut dire "ne pas fonctionner" ? Quels messages d'erreur ? Quel résultat attendu ?

  10. #10
    Membre régulier
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Septembre 2019
    Messages : 11
    Par défaut
    Merci tu es très gentil....

  11. #11
    Invité
    Invité(e)
    Par défaut
    "ça ne marche" n'est pas une description; c'est un constat stérile.

    quel est le but du script ?
    qu'obtiens-tu ?
    que devrais-tu obtenir ?
    ...

  12. #12
    Membre régulier
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Septembre 2019
    Messages : 11
    Par défaut
    "ça ne marche" n'est pas une description; c'est un constat stérile. Non c'est juste un constat

    quel est le but du script ? obtenir les noms des fichiers un à un
    qu'obtiens-tu ? les noms des fichiers un à un si je colle le texte dans un terminal .... des noms tronqués par des espaces si j'utilise un navigateur de fichiers
    que devrais-tu obtenir ? les noms des fichiers un à un ...dans les 2 cas

  13. #13
    Membre régulier
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Septembre 2019
    Messages : 11
    Par défaut
    bon j'essai d'avancer .... Le problème vient de la façon dont est interprété le IFS=$'\n'.

    Si je tape ceci dans une ligne de commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IFS=$'\n'
    set | grep ^IFS=
    echo $SHELL
    j'obtiens le résultat suivant

    IFS=$'\n'
    /bin/bash

    si je fais la même chose via un script ça me donne

    IFS='$\n'
    /bi /bash
    ce qui indique que dans ce cas c'est le n qui devient séparateur et non plus la fin de ligne, ce qui est le cas aussi avec ma liste de fichiers.

    Est ce que quelqu'un s'y connait suffisamment en shell pour expliquer le pourquoi du comment ?
    Merci

  14. #14
    Invité
    Invité(e)
    Par défaut
    tu n'as pas à modifier l'IFS.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in ./*; do echo ">$f<"; done
    c'est tout.
    le shell s'occupe de la protection des caractères qui pourraient gênés.

    à quoi sert le find ?

  15. #15
    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
    Citation Envoyé par adecot Voir le message
    Est ce que quelqu'un s'y connait suffisamment en shell pour expliquer le pourquoi du comment ?
    Le problème ne vient pas d'une connaissance ou méconnaissance du shell, mais de ce que tu as fait une faute de frappe dans ton script, où tu as mis '$\n' au lieu de $'\n'

  16. #16
    Invité
    Invité(e)
    Par défaut
    aucune importance :
    tu n'as pas à modifier l'IFS

  17. #17
    Membre régulier
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Septembre 2019
    Messages : 11
    Par défaut
    tu devrais jeter un coup d’œil sur le début de la discussion. C'est mieux d'avoir suivi avant d'intervenir. Tant que je n'affecte pas les noms de fichiers à une variable ça fonctionne évidemment tout simplement. C'est après que ça se corse....

  18. #18
    Invité
    Invité(e)
    Par défaut
    on ne sait toujours pas pourquoi tu veux employer l'une ou l'autre.
    a priori, ces commandes sont inutiles, surtout ls.

    c'est soit find tout seul, soit une boucle for, mais alors il faut expliquer ce que tu veux faire

    Or, tu ne dis pas ce que tu essayes de faire, on ne va pas avancer.

  19. #19
    Membre régulier
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Septembre 2019
    Messages : 11
    Par défaut
    Mais j'arrête pas de le dire. Je veux affecter la liste des fichiers (obtenue par ls ou find ou que sais je) à une variable pour pouvoir traiter les fichiers un à un.
    tant que f=element de la lise des fichers faire qque chose avec f fin

  20. #20
    Membre régulier
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Septembre 2019
    Messages : 11
    Par défaut pour balkani
    Non. Regarde le code. J'ai bien mis $'\n' et c'est le shell qui répond '$\n' (ne me demande pas pourquoi). Et de toutes façons j'ai mis 2 fois la même chose (copier/coller), donc le résultat serait le même

Discussions similaires

  1. Liste déroulante ne fonctionne pas avec IE8
    Par beegees dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/05/2012, 10h25
  2. Réponses: 11
    Dernier message: 06/07/2011, 19h30
  3. LIKE qui ne fonctionne pas avec une espace
    Par CinePhil dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/10/2008, 16h46
  4. Réponses: 11
    Dernier message: 05/03/2008, 15h07
  5. Réponses: 7
    Dernier message: 24/01/2006, 11h03

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