Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Terminal : produire une liste de répertoires

73 réponses
Avatar
olivier.marti
Bonjour,

Je souhaite travailler sur une liste de répertoires, avec un script ksh
du genre :

LISTE=$( find . -type d -print )

for DIR in ${LISTE}
do
cd "${DIR}"
...

Mais dans ma liste de répertoire certains noms contiennent des blancs.
Le 'for' les considère comme des séparateurs, et ça ne vas pas du tout !

Comment faire ?

Olivier

10 réponses

1 2 3 4 5
Avatar
Eric Levenez
Le 22/05/07 22:04, dans <1hyjasy.1ojaqrpvvxvwuN%, « FiLH »
a écrit :

Eric Levenez wrote:

Le 22/05/07 15:39, dans <1hyitvv.143aqhi1iu7rm9N%,

Je souhaite travailler sur une liste de répertoires, avec un script ksh
du genre :

LISTE=$( find . -type d -print )

for DIR in ${LISTE}
do
cd "${DIR}"
...


Mais dans ma liste de répertoire certains noms contiennent des blancs.
Le 'for' les considère comme des séparateurs, et ça ne vas pas du tout !

Comment faire ?


Je ferais un truc du genre :

find . -type d -print | while read DIR
do
cd "$DIR"
...


Je ferais du genre
do
(cd "*DIR"
....


)
Histoire de revenir au répertoire de départ avant le prochain cd...


Si ce n'est que cela, il suffit de faire un "cd -" à la fin de la boucle.
Cela est plus rapide et évite de lancer un sous-shell.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.



Avatar
Eric Levenez
Le 22/05/07 22:14, dans <1hyjbna.1ffojv7256uo0N%,
« Olivier Marti » a écrit :

Il ne se passe rien :


Si, il se passe quelque chose, mais seulement une fois

#!/bin/ksh
find . -type d -print | while read DIR
do
echo "$DIR"
cd "${DIR}"
pwd


Pour revenir au bon endroit (pour le cd de la boucle suivante) :

cd -

Sinon au lieu d'un "find ." tu peux faire un "find /xxx" pour avoir des
chemins absolus.

L'autre solution, proposée par FiLH est de créer un sous-shell par (...).

done


--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
filh
Eric Levenez wrote:

Le 22/05/07 22:04, dans <1hyjasy.1ojaqrpvvxvwuN%, « FiLH »

Eric Levenez wrote:

Le 22/05/07 15:39, dans <1hyitvv.143aqhi1iu7rm9N%,

Je souhaite travailler sur une liste de répertoires, avec un script ksh
du genre :

LISTE=$( find . -type d -print )

for DIR in ${LISTE}
do
cd "${DIR}"
...


Mais dans ma liste de répertoire certains noms contiennent des blancs.
Le 'for' les considère comme des séparateurs, et ça ne vas pas du tout !

Comment faire ?


Je ferais un truc du genre :

find . -type d -print | while read DIR
do
cd "$DIR"
...


Je ferais du genre
do
(cd "*DIR"
....


)
Histoire de revenir au répertoire de départ avant le prochain cd...


Si ce n'est que cela,


Ben sinon ça aura juste un peu de mal à marcher hein :)

il suffit de faire un "cd -" à la fin de la boucle.
Cela est plus rapide et évite de lancer un sous-shell.


À condition qu'il n'y ait pas d'autre cd de caché...
Même si le sous shell a d'autres inconvénenients.

FiLH

--
Le fondement du constat bourgeois, c'est le bon sens, c'est-à-dire
une vérité qui s'arrête sur l'ordre arbitraire de celui qui la parle.
Roland Barthes.
http://www.filh.org




Avatar
filh
Olivier Marti wrote:

Laurent Pertois wrote:

patpro ~ patrick proniewski wrote:

a mon avis, le plus simple c'est --exec dans le find.


Ca, j'y ai bien pensé en voyant ce que proposait Èric mais comme je me
suis gaufré une fois, je me le suis gardé :-D



--exec c'est pour faire une commande simple derrière, type rm, file, etc
... Mais si on a beaucoup de choses à faire derrière ?


Tout dépend : parfois on peut quasiment faire un shell script kivabien
:)

FiLH


--
Le fondement du constat bourgeois, c'est le bon sens, c'est-à-dire
une vérité qui s'arrête sur l'ordre arbitraire de celui qui la parle.
Roland Barthes.
http://www.filh.org



Avatar
Eric Levenez
Le 22/05/07 22:33, dans , « Erwan David »
a écrit :

Eric Levenez écrivait :

Le 22/05/07 22:14, dans <1hyjbna.1ffojv7256uo0N%,
« Olivier Marti » a écrit :

Il ne se passe rien :


Si, il se passe quelque chose, mais seulement une fois

#!/bin/ksh
find . -type d -print | while read DIR
do
echo "$DIR"
cd "${DIR}"
pwd


Pour revenir au bon endroit (pour le cd de la boucle suivante) :

cd -


Utiliser plutôt pushd et popd.
pushd est un cd qui mémoris en plus l'emplacement courant, popd annule
le dernier pushd.


Sauf que ksh n'a pas ces extensions (du GNU je crois).

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.



Avatar
olivier.marti
Eric Levenez wrote:

Le 22/05/07 22:14, dans <1hyjbna.1ffojv7256uo0N%,

Il ne se passe rien :


Si, il se passe quelque chose, mais seulement une fois



Ben non, vraiment rien, même pas une fois :

#!/bin/ksh

ROOT_DIR=$(pwd)

+ pwd
+ ROOT_DIR=/Users/marti/Web/Documents/DODS-IPSL
find ${ROOT_DIR} -type d -print | while read DIR
do
echo "$DIR"
cd "${DIR}"
pwd
done

+ find /Users/marti/Web/Documents/DODS-IPSL -type d -print
+ read DIR
echo fini
+ echo fini
fini


?????

Chez vous ça marche.

find /Users/marti/Web/Documents/DODS-IPSL -type d -print

donne bien une liste de répertoires (une vingtaine)

Olivier


Avatar
olivier.marti
Eric Levenez wrote:

Le 22/05/07 22:33, dans , « Erwan David »

Eric Levenez écrivait :

Le 22/05/07 22:14, dans <1hyjbna.1ffojv7256uo0N%,

Il ne se passe rien :


Si, il se passe quelque chose, mais seulement une fois

#!/bin/ksh
find . -type d -print | while read DIR
do
echo "$DIR"
cd "${DIR}"
pwd


Pour revenir au bon endroit (pour le cd de la boucle suivante) :

cd -


Utiliser plutôt pushd et popd.
pushd est un cd qui mémoris en plus l'emplacement courant, popd annule
le dernier pushd.


Sauf que ksh n'a pas ces extensions (du GNU je crois).


J'ai un mirbsdksh installé par Fink, et il a ça.

Olivier




Avatar
Eric Levenez
Le 22/05/07 23:06, dans <1hyjeml.d2xvy32r2vvqN%,
« Olivier Marti » a écrit :

Ben non, vraiment rien, même pas une fois :

#!/bin/ksh

ROOT_DIR=$(pwd)

+ pwd
+ ROOT_DIR=/Users/marti/Web/Documents/DODS-IPSL
find ${ROOT_DIR} -type d -print | while read DIR
do
echo "$DIR"
cd "${DIR}"
pwd
done

+ find /Users/marti/Web/Documents/DODS-IPSL -type d -print
+ read DIR
echo fini
+ echo fini
fini


?????

Chez vous ça marche.


Oui le même code que ci-dessus marche. Testé sur ma machine.

find /Users/marti/Web/Documents/DODS-IPSL -type d -print

donne bien une liste de répertoires (une vingtaine)


Je suppose que le code que tu postes n'est pas exactement celui que tu
utilises.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
Eric Levenez
Le 22/05/07 23:06, dans <1hyjetf.2qz8k8147xxudN%,
« Olivier Marti » a écrit :

J'ai un mirbsdksh installé par Fink, et il a ça.


Beurk. Plus tu vas utiliser des spécificités de certains shell, plus tu
auras de problèmes de portabilité.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

Avatar
Eric Levenez
Le 22/05/07 23:06, dans <1hyjetf.2qz8k8147xxudN%,
« Olivier Marti » a écrit :

#!/bin/ksh
J'ai un mirbsdksh installé par Fink, et il a ça.






Tu as écrasé le ksh du système par celui de MirBSD ?

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.





1 2 3 4 5