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 :

Bash - liste de fichiers contenant des espaces


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 142
    Points : 91
    Points
    91
    Par défaut Bash - liste de fichiers contenant des espaces
    Bonjour,

    Je me retrouve confronté à un problème, et il semble que mon cerveau de moineau est totalement largué. Je sollicite l'aide de personne qui pourrait rallumer ma green lantern ...

    L'idée est la suivante :
    Pour que ma femme puisse disposer d'une liste des fichiers mis en place sur notre système NAS/SAN (c'est tout un bordel, c'est mon délire mais c'est pas le sujet là), je me suis dit : ya qu'a faire un script en bash avec un ptit ls des dossiers et le tour est joué ... et ba non, parce que tous ses films sont avec des espaces ... du coup, ls apprécie pas du tout, j'ai beau faire pas mal de manipulation, si je veux lister film par film, ls me sort une liste d'un bloc, si je souhaite ajouter des caractères à la suite de chacun des films, ce n'est qu'a la fin du retour de la commande que les caractères sont ajoutés ...

    j'avais comme première idée de faire une boucle for et puis de réaliser un test sur chacune des valeurs de $i pour connaître sa nature (dossier, fichier). Mais dû coup, mon plan de génie est sacrément compromis.

    Pour le moment, je m'en tiens au strict minimum, je vais simplement lister le contenu du répertoire film et, dans le cas où il y a un sous répertoire, je le liste également, pas plus loin.

    Le script ci dessous fonctionne uniquement dans le cas de fichier ne contenant pas d'espace. Hélas ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for i in `ls`
    do
        if [ -d "$i" ]; then
        echo "+$i"
        for j in `ls $i`
           do
           echo " - $j"
           done
        else
        echo "- $i"
        fi
    done
    Avez-vous une idée pour que cela passe avec des espaces dans les noms de fichiers ? Devrais-je passer par un autre type de langage ?

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Nelmo Voir le message
    Avez-vous une idée pour que cela passe avec des espaces dans les noms de fichiers ? Devrais-je passer par un autre type de langage ?
    Salut

    L'idée: éviter le for qui se cale sur l'espace et passer par une commande qui se cale sur autre chose, comme par exemple le read qui se cale sur le return

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ls |while read i
    do
        if [ -d "$i" ]; then
        echo "+$i"
        ls "$i" |while read j
           do
           echo " - $j"
           done
        else
        echo "- $i"
        fi
    done
    Citation Envoyé par Nelmo Voir le message
    L'idée est la suivante :
    Pour que ma femme puisse disposer d'une liste des fichiers mis en place sur notre système NAS/SAN (c'est tout un bordel, c'est mon délire mais c'est pas le sujet là), je me suis dit : ya qu'a faire un script en bash avec un ptit ls des dossiers et le tour est joué
    T'as pas pensé aux commandes
    - tree
    - ls -R
    - find . -type f -print
    ???

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 142
    Points : 91
    Points
    91
    Par défaut
    Merci pour tes réponses, je pense que je suis simplement resté entêté sur le coup du ls ... je vais regarder de ce coté.

    Je vous tiens au jus.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 142
    Points : 91
    Points
    91
    Par défaut
    Tree a réglé mes soucis

    Je vais quand même voir comment celle-ci fonctionne car c'est exactement ce que je souhaitais programmer ;'( je reste sur ma faim.

    Merci pour ton aide, je clos le sujet.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Nelmo Voir le message
    ...car c'est exactement ce que je souhaitait programmer ;'(
    Code bash : 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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #!/bin/sh
    # Programme qui affiche les répertoires sous forme d'arborescence (tree DOS)
    # Usage: prog fic1 [fic2 ...]
     
    # Fonction d'affichage d'un texte précédé de "n" tabulations
    # Paramètres entrée :
    #	nb de tabulations
    #	texte à afficher (…)
    # Valeur sortie : aucune
    affiche_tabul()
    {
    	# Création d'un sous-shell pour isoler le contexte
    	(
    		# Récupération du nb de tabulations - On supprime $1
    		tab=$1; shift
     
    		# Affichage du texte précédé des tabulations en utilisant "awk"
    		echo $* |awk -vtab=$tab '{for (i=0; i<tab; i++) printf("\t"); printf("%s\n", $0)}'
    	)
    }
     
    # Fonction arborescence (fonction récursive)
    # Paramètres entrée :
    #	nom de fichier
    #	profondeur (facultatif)
    # Valeur sortie : aucune
    tree_r()
    {
    	# Création d'un sous-shell pour isoler le contexte
    	(
    		# Récupération profondeur si elle existe
    		prof=${2:-0}
     
    		# Affichage de l'argument 1 avec autant de tabulations que profondeur
    		affiche_tabul $prof $1
     
    		# Si argument 1 répertoire et pas lien symbolique
    		if test -d "$1" -a ! -L "$1"
    		then
    			# De nouveau création d'un sous-shell pour isoler de nouveau le contexte
    			(
    				# Déplacement dans ce répertoire (seul ce contexte se déplace)
    				cd "$1"
     
    				# Pour chaque fichier de ce répertoire
    				ls -1 |while read file
    				do
    					# Fonction récursive sur ce fichier avec profondeur incrémentée
    					tree_r "$file" `expr $prof + 1`
    				done
    			)
    			# Fin du sous-shell - Le contexte actuel n'a pas changé de répertoire
    		fi
    	)
    }
     
    # Programme
    # Boucle sur chaque fichier passé au programme
    for fic in $*
    do
    	echo "Arborescence de '$fic'"
    	tree_r $fic
    	echo
    done

    Citation Envoyé par Nelmo Voir le message
    je reste sur ma faim.
    Régale-toi.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/11/2013, 18h43
  2. Noms de fichiers contenant des espaces
    Par berti dans le forum Langage
    Réponses: 1
    Dernier message: 05/10/2008, 12h19
  3. Réponses: 9
    Dernier message: 29/04/2008, 13h38
  4. Renommer des fichiers contenant des espaces
    Par MatRem dans le forum Linux
    Réponses: 6
    Dernier message: 28/04/2006, 08h21
  5. Réponses: 2
    Dernier message: 26/02/2003, 15h18

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