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 POSIX Discussion :

Boucle for et fichiers contenant un espace


Sujet :

Shell et commandes POSIX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut Boucle for et fichiers contenant un espace
    Bonjour,

    J'essaie de parcourir un répertoire qui contient des fichiers, dont certains ont un espace dans le nom, et je n'y arrive pas...

    Pour créer un répertoire de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mkdir test_toto
    touch "test_toto/this is a test"
    touch "test_toto/not one more"
    Ce qui me pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for FILE in $(find test_toto -type f -exec basename {} \; )
    do
      echo "file : >>$FILE<<"
    done
    Sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    file : >>this<<
    file : >>is<<
    file : >>a<<
    file : >>test<<
    file : >>not<<
    file : >>one<<
    file : >>more<<
    Ce que je voudrais obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    file : >>this is a test<<
    file : >>not one more<<
    Et j'ai beau essayer dans tous les sens, je n'y arrive pas... Une idée à suggérer ?

    Merci
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

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

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

    pourquoi utiliser une boucle ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find test-toto -type f -exec sh -c 'f=$(basename "$0"); echo "file: >>$f<<"' {} \;
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    pourquoi utiliser une boucle ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find test-toto -type f -exec sh -c 'f=$(basename "$0"); echo "file: >>$f<<"' {} \;
    ...
    ?
    J'utilise une boucle car je fais d'autres choses

    J'ai un répertoire qui contient beaucoup de fichiers, et je cherche à mettre tous ces noms de fichiers dans des variables en les séparant par des "|", et en limitant le nombre de caractères dans la variable à 2000 --> Donc j'utilise un tableau KSH :

    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
    MAX_LEN_GREP=2000
    set -A LIST
    i=1
    LIST[$i]=""
    
    for FILE in $(find test_toto -type f -exec basename {} \; )
    do
      LIST[$i]="$FILE|${LIST[$i]}"
      if [[ $(echo ${LIST_EXE[$i]} | wc -c) -gt $MAX_LEN_GREP ]] ##oui, je sais, je coupe a plus que 2000, c est prevu
      then
        (( i += 1 ))
      fi
    
    done
    
    ## Et ici je fais des choses avec LIST[$i]
    
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    Code pdksh : Sélectionner tout - Visualiser dans une fenêtre à part
    find test_toto -type f -print0 | while read -d '' f; do f=$(basename "$f"); echo "construire tableau avec $f"; done
    parce que c'est KSH; dash (c'est à dire le shell le plus POSIX que j'ai à ma disposition) ne reconnaît pas l'option -d de read
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Tout d'abord, merci beaucoup pour ta réponse.

    Maintenant, y'a un truc que je ne comprends pas : lorsque je tape find . -type f -print0 | while read -d '' f; do f=$(basename $f) ; echo $f ; done dans mon terminal, il affiche bien le resultat escompté. Mais dans mon script, la même ligne n'affiche rien du tout....

    Je sais que suis fatigué, mais quand même, le echo devrait bien afficher quelque chose, non ??
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Il faudriat que tu en dises plus sur ton script et ton terminal.

    De toute façon, "-print0" n'est pas POSIX, pas plus que le tableaux ("set -A") ou la lecture délimitée ("read -d").

    Voici une suggestion qui devrait marcher sous tout système POSIX, sous réserve qu'il n'y a pas de nom de fichier avec un saut de ligne à l'interieur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    find /tmp -type f -exec basename {} \; | (
    while read file ; do
      echo $file
      [ $# -gt 0 ] && set -- "$@" "$file" || set -- "$file"
    done
     
    for f do
      echo ">>> $f <<<"
    done
    )

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 29/04/2008, 13h38
  2. Nom de fichier contenant un espace
    Par fredo78 dans le forum Mise en forme
    Réponses: 2
    Dernier message: 15/12/2007, 13h12
  3. Boucle for sur fichiers sauf un !
    Par coincoin22 dans le forum Linux
    Réponses: 4
    Dernier message: 13/08/2007, 14h41
  4. Réponses: 2
    Dernier message: 22/05/2006, 00h07
  5. Renommer des fichiers contenant des espaces
    Par MatRem dans le forum Linux
    Réponses: 6
    Dernier message: 28/04/2006, 08h21

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