OVH Cloud OVH Cloud

[bash] bonne façon de faire une boucle sur un ensemble de fichiers contenu dans un dossier

35 réponses
Avatar
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.


--
François Lafont

10 réponses

1 2 3 4
Avatar
xavier
Nicolas George <nicolas$ wrote:

> export func
> find /dossier-type f -exec sh -c 'func $1' _ {} ;

N'importe quoi.



Je n'ai jamais trouvé d'autre moyen pour faire exécuter une fonction du
script en cours par find -exec

--
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)
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 22/05/2011 19:30, Nicolas George a écrit :
echo "$BIDULE""muche"



Oui mais des fois tu ne pourras pas t'en sortir avec des quotes.

Sans parler des
BIDULE=foo:bar
echo ${BIDULE%:*}
ou encore
unset NOT_EXISTING
echo ${NOT_EXISTING:-defaultValue}

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN2U8cAAoJEK8zQvxDY4P9hLsIAJYXMa1ZvHw5ttk23a1rwTmy
2uewngQzUa6OYpoOU8zUuwQ/vI7GWAfgBRwFUjsNySQNW5R67BvlLBQcbtJF809s
xXTMW9iguw4ov6ZTtanOMOe95jgAip0+2OrC5xQtWxngXphVUBBiC8YH0wLZpzb2
1p0mYXOjlvObyT7njZxN9jeDR07FAX8Jwpnz0L931cnx4g0t5q4MVwASmS+j6uI/
SrmeMruWjZKdZmPiSekfilINsRCRhUaItWqxquETc5111JUmhtd/3ScqY3ifOQ3i
APNrKiT8IskF4Nz88C/w9eskTX1r6qaAgZUqCOzimTkwjpOHw9fcOJWrbW8m/xg =SqVi
-----END PGP SIGNATURE-----
Avatar
Nicolas George
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.
Avatar
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
Avatar
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.
Avatar
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)
Avatar
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.
Avatar
Floris Dubreuil
Le 22/05/2011 18:27, Francois Lafont a écrit :
Bonjour à tous,

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
Avatar
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
Avatar
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)
1 2 3 4