OVH Cloud OVH Cloud

"Nettoyer" une arborescence

12 réponses
Avatar
Jerome Lambert
Bonsoir,

J'ai téléchargé une arborescence complète d'albums contenant non
seulement des fichiers ogg vorbis, mais aussi des images, textes et
fichiers html.

Comment puis-je faire (en bash) pour parcourir toute l'arborescence en
supprimant tout fichier qui ne serait pas un .ogg?

Merci de toute aide,

Jerome.

2 réponses

1 2
Avatar
drkm
Stephane Chazelas writes:

http://www.opengroup.org/onlinepubs/009695399/utilities/find.html

pour la specification POSIX de find.


Tiré de cette page :

Only a plus sign that follows an argument containing the two
characters "{}" shall punctuate the end of the primary
expression. Other uses of the plus sign shall not be treated as
special.

Je ne comprend pas cette restriction. Si l'on a une commande à
laquelle on doit passer la liste des fichiers, mais pas en dernières
positions, ce n'est donc pas possible ? Quelque chose comme :

find <path> -exec cmd '{}' '+' arg ';'

? À la rigueur, il me semble que la syntaxe suivane n'aurait pu
changer la sémantique d'aucune commande find existante :

find <path> -exec cmd '{}' arg '+'

Si ?

--drkm

Avatar
Stephane Chazelas
2004-12-01, 23:32(+01), drkm:
[...]
Only a plus sign that follows an argument containing the two
characters "{}" shall punctuate the end of the primary
expression. Other uses of the plus sign shall not be treated as
special.

Je ne comprend pas cette restriction. Si l'on a une commande à
laquelle on doit passer la liste des fichiers, mais pas en dernières
positions, ce n'est donc pas possible ? Quelque chose comme :

find <path> -exec cmd '{}' '+' arg ';'


Non, pas possible, faut passer par un shell:

find <path> -exec sh -c 'shift "$1"; exec cmd "$@" arg' 2 1 '{}' +

(ou, si on suppose que le shell est POSIX):

find <path> -exec sh -c 'exec cmd "$@" arg' find-sh '{}' +


? À la rigueur, il me semble que la syntaxe suivane n'aurait pu
changer la sémantique d'aucune commande find existante :

find <path> -exec cmd '{}' arg '+'
[...]


Question de choix, j'imagine, la syntaxe de find est de toute
facon non deterministe des le depart. Autoriser {} + seulement
est un moindre mal, mais il n'y a pas de solution parfaite.

Le seul truc acceptable, c'aurait ete:

find -type f -exec-arg cmd -exec-arg -i -exec-multi-repl
-exec-arg arg -o -print -- <path> <path>
(avec -exec-single-repl pour un seul repl)

Ou peut-etre:

find -type f -eexec a:cmd a:-i r:1- a:arg -o -print -- <path> <path>

(avec r:1, r:5 pour les 1er et 5e arguments d'une liste de 5,
avec aussi r:1-5,7,8... etc. Ca permettrait de remplacer le -n de
xargs).

Pour lever toute ambiguité.

--
Stephane

1 2