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.

10 réponses

1 2
Avatar
Jerome Lambert
En fait, j'arrive à récupérer la liste des indésirables avec
find ./ ! -name *.ogg

mais je n'arrive pas à "tuber" le résultat avec une commande de
suppression...

Si quelqu'un a une piste...
Avatar
Serge Gagnon
On Wed, 1 Dec 2004, "Jerome" == Jerome Lambert wrote:






Jerome> En fait, j'arrive à récupérer la liste des indésirables avec
Jerome> find ./ ! -name *.ogg

Jerome> mais je n'arrive pas à "tuber" le résultat avec une commande de
Jerome> suppression...

Jerome> Si quelqu'un a une piste...

Avec le find de FreeBSD
find ./ ! -name '*.ogg' -delete


--
Serge Gagnon
Quebec, Qc, Canada





Avatar
Serge Gagnon
On Tue, 30 Nov 2004, "Serge" == Serge Gagnon wrote:

On Wed, 1 Dec 2004, "Jerome" == Jerome Lambert wrote:






Jerome> En fait, j'arrive à récupérer la liste des indésirables avec
Jerome> find ./ ! -name *.ogg

Jerome> mais je n'arrive pas à "tuber" le résultat avec une commande de
Jerome> suppression...

Jerome> Si quelqu'un a une piste...

Serge> Avec le find de FreeBSD find ./ ! -name '*.ogg' -delete

Sinon
find ./ ! -name '*.ogg' -exec rm -- '{}' ';'
sur FreeBSD et tout dependant du shell


--
Serge Gagnon
Quebec, Qc, Canada





Avatar
Christian CAMIER
Serge Gagnon wrote:
...

Sinon
find ./ ! -name '*.ogg' -exec rm -- '{}' ';'
sur FreeBSD et tout dependant du shell




Essaie la commande xargs(1). Ce qui donne dans ton exemple :
find ./ ! -name '*.ogg' -print | xargs rm -f

xargs prend l'entrée standard et place les lignes lues en arguments sur
la ligne de commande suivant "xargs".

Avatar
Serge Gagnon
On Wed, 1 Dec 2004, "Erwan" == Erwan David wrote:






Erwan> Serge Gagnon écrivait :

On Wed, 1 Dec 2004, "Jerome" == Jerome Lambert wrote:







Jerome> En fait, j'arrive à récupérer la liste des indésirables avec
Jerome> find ./ ! -name *.ogg

Jerome> mais je n'arrive pas à "tuber" le résultat avec une commande de
Jerome> suppression...

Jerome> Si quelqu'un a une piste...

+> Avec le find de FreeBSD find ./ ! -name '*.ogg' -delete

Erwan> find ./ ! -name '*.ogg'|xargs rm

Erwan> Plus portable

Certains find n'ont pas tous de -exec ?

--
Serge Gagnon
Quebec, Qc, Canada






Avatar
Laurent Wacrenier
Erwan David écrit:
Certains find n'ont pas tous de -exec ?


J'en ai connu sans -delete (SunOS 4.1). Et le -exec a l'inconvénient
de forker un processus rm par fichier, tandis que xargs va regrouper
les fichiers.


Mais le nom du fichier est envoyé proprement, avec xargs, on a des
effets de bord lorsque le fichier contient des espaces (et -print0
n'est pas présent dans tous les find ou -0 n'est pas une option sur
tous les xargs)


Avatar
Stephane Chazelas
2004-12-01, 02:07(+01), Christian CAMIER:
Serge Gagnon wrote:
...

Sinon
find ./ ! -name '*.ogg' -exec rm -- '{}' ';'
sur FreeBSD et tout dependant du shell




Essaie la commande xargs(1). Ce qui donne dans ton exemple :
find ./ ! -name '*.ogg' -print | xargs rm -f

xargs prend l'entrée standard et place les lignes lues en arguments sur
la ligne de commande suivant "xargs".


Pas seulement les lignes, et c'est le probleme d'xargs. xargs
n'est pas prevu pour prendre sur son entree standard la sortie
de find (sauf a utiliser les option GNU -print0 et -0).

La liste fournie a xargs doit avoir un format bien precis (qui
peut varier d'une implementation a l'autre)

xargs rm -f -- << EOF
fichier1 "fichier 2" fichier
3
EOF

effacera les 3 fichiers "fichier1" "fichier 2" et "fichiern3"

find afficherait ces trois fichiers comme ca:
./fichier1
./fichier 2
./fichier
3

Si on passe ca a xargs, xargs va effacer les 4 fichiers
"./fichier1", "./fichier", "2" et "3".

La commande standard (pas encore GNU) est:

find . ! -name '*.ogg' -exec rm '{}' +

Note que les version 4.2 de GNU find ont -delete aussi (et
corrigent enfin le bug qui feraient qu'un fichier .foo.ogg dans
l'exemple ci-dessus serait effacé)

--
Stephane


Avatar
Jerome Lambert
Le Wed, 01 Dec 2004 09:45:52 +0000, Stephane Chazelas a écrit :
(...)
[En fait, j'avais trouvé à force de chercher et donc j'avais annulé mes
messages, mais merci quand même ;-) ]

La commande standard (pas encore GNU) est:

find . ! -name '*.ogg' -exec rm '{}' +


Quelle différence avec ce que j'ai fait:
find ./ ! -name *.ogg -exec rm {} ;

ou plus exactement, quelle est l'influence des quote '' et pourquoi + au
lien de ; ?

(...)

Avatar
Stephane Chazelas
2004-12-01, 13:10(+01), Jerome Lambert:
[...]
La commande standard (pas encore GNU) est:

find . ! -name '*.ogg' -exec rm '{}' +


Quelle différence avec ce que j'ai fait:
find ./ ! -name *.ogg -exec rm {} ;

ou plus exactement, quelle est l'influence des quote ''


Empeche le shell de traiter {} specialement. {} ne devrait pas
etre traité specialement dans la plupart des shells, car c'est
un cas particulier, mais "{a}", "{,}", "{", "}" peuvent l'etre
donc, je prefere eviter tout probleme (eventuellement futur
probleme) en quotant les caracteres speciaux { et }. (remarque,
c'est la meme chose pour "!")

et pourquoi + au
lien de ; ?



Justement pour eviter de lancer une commande pour chaque
fichier. Comme pour xargs, ca passe autant de fichiers que
possible a la commande.

Voir:

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

pour la specification POSIX de find.

--
Stephane


Avatar
Stephane Dupille
La commande standard (pas encore GNU) est:



Pas BSD non plus d'ailleurs. :(

find . ! -name '*.ogg' -exec rm '{}' +
Quelle différence avec ce que j'ai fait:

find ./ ! -name *.ogg -exec rm {} ;
ou plus exactement, quelle est l'influence des quote '' et pourquoi + au
lien de ; ?


Les quotes protègent l'évaluation de l'* par le shell.

Le +, permet d'avoir un fonctionnement identique (dans l'esprit) à
ce qu'on ferait avec xargs :
find . ! -name "*.ogg" -print | xargs rm
c-à-d qu'au lieu de lancer un process rm par fichier, ça en lance un
seul avec tous les noms de fichiers sur la ligne de commande.

--
AC> Nous avions par ailleurs l'habitude de poster parfois sur
AC> fr.misc.justice, nous ne le pouvons plus !
Ce forum n'existant pas, ce n'est pas étonnant ....
-+- BE in GNU - Les aventuriers (ridicules) du forum perdu. -+-


1 2