Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/09/2011, 22h22   #1
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 116
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 116
Points : 26
Points : 26
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 :
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 ?
Nelmo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 22h52   #2
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
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 : 3 055
Points : 4 934
Points : 4 934
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 :
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
???
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 23h14   #3
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 116
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 116
Points : 26
Points : 26
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.
Nelmo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 23h25   #4
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 116
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 116
Points : 26
Points : 26
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.
Nelmo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 09h05   #5
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
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 : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par Nelmo Voir le message
...car c'est exactement ce que je souhaitait programmer ;'(
Code bash :
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.
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h08.


 
 
 
 
Partenaires

Hébergement Web