[bash] bonne façon de faire une boucle sur un ensemble de fichiers contenu dans un dossier
35 réponses
Francois Lafont
Bonjour à tous,
Assez régulièrement, je suis amené à me faire des petits scripts bash
qui font une boucle sur une liste de fichiers contenus dans un dossier
(et dans ses sous-dossiers etc). La liste de fichiers, qui peut être
assez grande, est obtenue à l'aide de la commande find. Le but est de
faire un même petit traitement sur chacun des fichiers de cette liste
via une boucle (le traitement importe peu ici, ça peut être un
"renommage", un grep etc). La structure de mes petits scripts
ressemblent à ça du coup (c'est un exemple) :
#-------------------------------------
for fichier in $(find /le/dossier/ -type f -iname '*.tex')
do
echo Traitement de $fichier
# etc.
done
#-------------------------------------
Est-ce la bonne façon de procéder ? J'ai des doutes :
1) En effet, finalement le script revient à ça :
#-------------------------------------
for fichier in /le/dossier/f1.tex /le/dossier/f2.tex /le/dossier/f3.tex
do
echo Traitement de $fichier
# etc.
done
#-------------------------------------
Du coup, si la liste est très grande, ça me semble un peu maladroit
comme script et peut-être pas très performant. (Aucune certitude bien
sûr, c'est juste une intuition.)
2) Une autre chose qui me fait penser que ce n'est peut-être pas la
bonne façon de procéder, c'est le problème avec les noms de fichiers qui
contiennent un espace. Si find détecte un fichier qui s'appelle par
exemple "/le/dossier/sous dossier/toto.tex" alors, durant la boucle,
$fichier sera égal à la chaîne "/le/dossier/sous" puis à
"dossier/toto.tex" mais jamais à "/le/dossier/sous dossier/toto.tex".
Bref, quelle est la bonne façon de faire ce genre de boucle ?
Merci d'avance pour votre aide.
Xavier, dans le message <1k1ops0.wg09de1p7sta8N%, a écrit :
Je n'ai jamais trouvé d'autre moyen pour faire exécuter une fonction du script en cours par find -exec
On ne peut pas, point. Et exporter n'a aucun sens pour une fonction, ça n'a de sens que pour une variable.
Francois Lafont
Le 22/05/2011 20:00, Nicolas George a écrit :
Je n'ai jamais trouvé d'autre moyen pour faire exécuter une fonction du script en cours par find -exec
On ne peut pas, point.
Personnellement, je n'ai pas réussi à faire fonctionner l'exemple de Xavier. Si vous avez un mini exemple complet qui marche... Mais bon, c'est juste par curiosité.
-- François Lafont
Le 22/05/2011 20:00, Nicolas George a écrit :
Je n'ai jamais trouvé d'autre moyen pour faire exécuter une fonction du
script en cours par find -exec
On ne peut pas, point.
Personnellement, je n'ai pas réussi à faire fonctionner l'exemple de
Xavier. Si vous avez un mini exemple complet qui marche... Mais bon,
c'est juste par curiosité.
Je n'ai jamais trouvé d'autre moyen pour faire exécuter une fonction du script en cours par find -exec
On ne peut pas, point.
Personnellement, je n'ai pas réussi à faire fonctionner l'exemple de Xavier. Si vous avez un mini exemple complet qui marche... Mais bon, c'est juste par curiosité.
-- François Lafont
Nicolas George
Francois Lafont , dans le message <4dd9568c$0$20808$, a écrit :
Personnellement, je n'ai pas réussi à faire fonctionner l'exemple de Xavier.
C'est normal.
Si vous avez un mini exemple complet qui marche...
Il n'y en a pas, sa solution juste ne marche pas.
Francois Lafont , dans le message
<4dd9568c$0$20808$426a74cc@news.free.fr>, a écrit :
Personnellement, je n'ai pas réussi à faire fonctionner l'exemple de
Xavier.
C'est normal.
Si vous avez un mini exemple complet qui marche...
Francois Lafont , dans le message <4dd9568c$0$20808$, a écrit :
Personnellement, je n'ai pas réussi à faire fonctionner l'exemple de Xavier.
C'est normal.
Si vous avez un mini exemple complet qui marche...
Il n'y en a pas, sa solution juste ne marche pas.
xavier
Nicolas George <nicolas$ wrote:
> Si vous avez un mini exemple complet qui marche...
Il n'y en a pas, sa solution juste ne marche pas.
Ben si :
----------- #!/bin/sh
myls () { F="$1" echo "$F" }
export -f myls
find /usr/bin -type f -exec sh -c 'myls $1' _ {} ; ----------
Testé et validé. Bon, sur MacOSX, sh est un hardlink de bash, mais je ne crois pas que cela change grand chose... A part ça, c'est du code de test, évidemment.
-- XAv In your pomp and all your glory you're a poorer man than me, as you lick the boots of death born out of fear. (Jethro Tull)
Nicolas George <nicolas$george@salle-s.org> wrote:
> Si vous avez un mini exemple complet qui marche...
Il n'y en a pas, sa solution juste ne marche pas.
Ben si :
-----------
#!/bin/sh
myls () {
F="$1"
echo "$F"
}
export -f myls
find /usr/bin -type f -exec sh -c 'myls $1' _ {} ;
----------
Testé et validé. Bon, sur MacOSX, sh est un hardlink de bash, mais je ne
crois pas que cela change grand chose... A part ça, c'est du code de
test, évidemment.
--
XAv
In your pomp and all your glory you're a poorer man than me,
as you lick the boots of death born out of fear.
(Jethro Tull)
> Si vous avez un mini exemple complet qui marche...
Il n'y en a pas, sa solution juste ne marche pas.
Ben si :
----------- #!/bin/sh
myls () { F="$1" echo "$F" }
export -f myls
find /usr/bin -type f -exec sh -c 'myls $1' _ {} ; ----------
Testé et validé. Bon, sur MacOSX, sh est un hardlink de bash, mais je ne crois pas que cela change grand chose... A part ça, c'est du code de test, évidemment.
-- XAv In your pomp and all your glory you're a poorer man than me, as you lick the boots of death born out of fear. (Jethro Tull)
Nicolas George
Xavier, dans le message <1k1ov9c.10i21tu17wx174N%, a écrit :
Testé et validé. Bon, sur MacOSX, sh est un hardlink de bash, mais je ne crois pas que cela change grand chose...
Si, ça change tout.
Et accessoirement, ça pue le trou de sécurité à dix kilomètres.
Xavier, dans le message <1k1ov9c.10i21tu17wx174N%xavier@groumpf.org>, a
écrit :
Testé et validé. Bon, sur MacOSX, sh est un hardlink de bash, mais je ne
crois pas que cela change grand chose...
Si, ça change tout.
Et accessoirement, ça pue le trou de sécurité à dix kilomètres.
Bref, quelle est la bonne façon de faire ce genre de boucle ?
Ben, j'ai comme un doute en voyant toutes les réponses avant moi mais, à tout hasard, xargs ça sent le paté ?
Cdlt,
-- Floris Dubreuil
Sergio
Le 22/05/2011 22:04, Xavier a écrit :
----------- #!/bin/sh
myls () { F="$1" echo "$F" }
export -f myls
find /usr/bin -type f -exec sh -c 'myls $1' _ {} ; ----------
Testé et validé. Bon, sur MacOSX, sh est un hardlink de bash, mais je ne crois pas que cela change grand chose... A part ça, c'est du code de test, évidemment.
Pour avoir vaguement manipulé, il me semble que le "find" de Mac OS/X est un peu réduit par rapport au find de Linux, non ?
-- Serge http://leserged.online.fr/ Mon blog: http://cahierdesergio.free.fr/ Soutenez le libre: http://www.framasoft.org
Le 22/05/2011 22:04, Xavier a écrit :
-----------
#!/bin/sh
myls () {
F="$1"
echo "$F"
}
export -f myls
find /usr/bin -type f -exec sh -c 'myls $1' _ {} ;
----------
Testé et validé. Bon, sur MacOSX, sh est un hardlink de bash, mais je ne
crois pas que cela change grand chose... A part ça, c'est du code de
test, évidemment.
Pour avoir vaguement manipulé, il me semble que le "find" de Mac OS/X est un peu réduit par rapport au find de Linux, non ?
--
Serge http://leserged.online.fr/
Mon blog: http://cahierdesergio.free.fr/
Soutenez le libre: http://www.framasoft.org
find /usr/bin -type f -exec sh -c 'myls $1' _ {} ; ----------
Testé et validé. Bon, sur MacOSX, sh est un hardlink de bash, mais je ne crois pas que cela change grand chose... A part ça, c'est du code de test, évidemment.
Pour avoir vaguement manipulé, il me semble que le "find" de Mac OS/X est un peu réduit par rapport au find de Linux, non ?
-- Serge http://leserged.online.fr/ Mon blog: http://cahierdesergio.free.fr/ Soutenez le libre: http://www.framasoft.org
xavier
Sergio wrote:
Pour avoir vaguement manipulé, il me semble que le "find" de Mac OS/X est un peu réduit par rapport au find de Linux, non ?
Si tu veux dire par là que ce n'est pas un Gnu find, c'est effectivement le cas.
-- XAv In your pomp and all your glory you're a poorer man than me, as you lick the boots of death born out of fear. (Jethro Tull)
Sergio <serge.laposte@delbono.net.invalid> wrote:
Pour avoir vaguement manipulé, il me semble que le "find" de Mac OS/X est
un peu réduit par rapport au find de Linux, non ?
Si tu veux dire par là que ce n'est pas un Gnu find, c'est effectivement
le cas.
--
XAv
In your pomp and all your glory you're a poorer man than me,
as you lick the boots of death born out of fear.
(Jethro Tull)