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

find et negation de regex

24 réponses
Avatar
Mihamina Rakotomandimby
Bonjour,
J'ai un repertoire qui contient des fichiers en tout genre.
Je veux n'en garder que les fichiers PHP, HTML et CSS.
La recherche sera basée sur l'extension du fichier.
Ce que j'ai voulu faire c'est chercher tous les fichiers dont le nom ne
contient ni html, ni htm, ni php, ni css et les supprimer.

Mon problème c'est que je ne sais pas comment faire de négation dans la
recherche de fichiers. Une fois la négation faisable, je saurais faire,
avec -exec la suppression qu'il faut.

J'ai parcouru rapidement le man et quelques documents sur internet, mais
je n'arive à rien meme apres quelques tentatives de tatonnement...

Auriez-vous une piste?

Voici ma version de find:
mihamina@localhost:~/ja_genista$ find --version
GNU find version 4.2.31
Built using GNU gnulib version 2007-02-24
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION

--
Huile Essentielle de Camphre http://www.huile-camphre.fr
Infogerance http://www.infogerance.us
(Serveurs, Postes de travail, Développement logiciel)

10 réponses

1 2 3
Avatar
Stephane Chazelas
2008-03-13, 11:54(+03), Mihamina Rakotomandimby:
[...]
Ce que j'ai voulu faire c'est chercher tous les fichiers dont le nom ne
contient ni html, ni htm, ni php, ni css et les supprimer.
[...]


find . ! -name '*.htm' ! -name '*.html' ... -exec rm -f {} +

--
Stéphane

Avatar
Jacques L'helgoualc'h
Le 13-03-2008, Mihamina Rakotomandimby a écrit :
Bonjour,


bonjour.

J'ai un repertoire qui contient des fichiers en tout genre.
Je veux n'en garder que les fichiers PHP, HTML et CSS.
La recherche sera basée sur l'extension du fichier.
Ce que j'ai voulu faire c'est chercher tous les fichiers dont le nom ne
contient ni html, ni htm, ni php, ni css et les supprimer.


~ $ find --version
« find » de GNU version 4.2.28
Options activées: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION

~ $ find bac_a_sable/ -type f -not -iregex 'x.*.(css|html?|php)$'

--
Jacques L'helgoualc'h

Avatar
Jacques L'helgoualc'h
Le 13-03-2008, Mihamina Rakotomandimby a écrit :
Bonjour,


bonjour.

J'ai un repertoire qui contient des fichiers en tout genre.
Je veux n'en garder que les fichiers PHP, HTML et CSS.
La recherche sera basée sur l'extension du fichier.
Ce que j'ai voulu faire c'est chercher tous les fichiers dont le nom ne
contient ni html, ni htm, ni php, ni css et les supprimer.


~ $ find --version
« find » de GNU version 4.2.28
Options activées: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION

~ $ find bac_a_sable/ -type f -not -iregex '.*.(css|html?|php)$'

--
Jacques L'helgoualc'h

Avatar
moinsdespam
Dans <fraq4n$186d$,
Bonjour,
J'ai un repertoire qui contient des fichiers en tout genre.
Je veux n'en garder que les fichiers PHP, HTML et CSS.
La recherche sera basée sur l'extension du fichier.
Ce que j'ai voulu faire c'est chercher tous les fichiers dont le nom ne
contient ni html, ni htm, ni php, ni css et les supprimer.

J'ai parcouru rapidement le man et quelques documents sur internet, mais
je n'arive à rien meme apres quelques tentatives de tatonnement...


Il fallait parcourir plus longuement le man. Si c'est faisable, ça s'y
trouve forcement

Auriez-vous une piste?


Dans le man :
! expr True if expr is false.

Ce qui donne :
find . ! -name *txt

pour afficher tous les fichiers qui ne finissent pas par txt.


Voici ma version de find:
:~/ja_genista$ find --version
GNU find version 4.2.31
Built using GNU gnulib version 2007-02-24
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION


J'ai la même.

--
Frédéric
Bleu,e adj. et n. m. Qui est d'une couleur voisine du rouge, mais pas très : un
ciel bleu, des yeux bleus, les flots bleus [..]. Fig. Bouch. : un steak bleu ;
s'emploie pour désigner un steak rouge. (Pierre Desproges : D.S.U.É (et des BN))

Avatar
Cyrille Lefevre
2008-03-13, 11:54(+03), Mihamina Rakotomandimby:
[...]
Ce que j'ai voulu faire c'est chercher tous les fichiers dont le nom n e
contient ni html, ni htm, ni php, ni css et les supprimer.
[...]


find . ! -name '*.htm' ! -name '*.html' ... -exec rm -f {} +


pas en forme aujourd'hui, il manque le ; final :)
ne faut il pas quoté les {} ?, par ailleurs, le + ne me semble pas
portable, mais je n'ai pas vérifié...

Bonjour,

alternative :

find . ( -name '*.htm*' -o -name '*.php*' -o '*.css*' )
-prune -o -print | xargs rm -f

su find == gnu et xargs idem :

find . ( -name '*.htm*' -o -name '*.php*' -o '*.css*' )
-prune -o -print0 | xargs -0 rm -f

ce qui permet de traiter les fichiers avec des blancs dans le nom.

PS : l'interret du -prune est que s'il existe un répertoire en .htm
tout son contenu ne sera pas traité, sinon, je vous laisse voir ce
qui ce passe :)

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
remove "%nospam" and ".invalid" to answer me.


Avatar
Stephane Chazelas
2008-03-13, 23:29(+01), Cyrille Lefevre:
2008-03-13, 11:54(+03), Mihamina Rakotomandimby:
[...]
Ce que j'ai voulu faire c'est chercher tous les fichiers dont le nom ne
contient ni html, ni htm, ni php, ni css et les supprimer.
[...]


find . ! -name '*.htm' ! -name '*.html' ... -exec rm -f {} +


pas en forme aujourd'hui, il manque le ; final :)
ne faut il pas quoté les {} ?, par ailleurs, le + ne me semble pas
portable, mais je n'ai pas vérifié...


Le "+" est standard et est une alternative a ";". Avec des
shells standard, pas besoin de quoter "{}".

alternative :

find . ( -name '*.htm*' -o -name '*.php*' -o '*.css*' )
-prune -o -print | xargs rm -f


pourquoi exclure les .html.gz, .htmp-xxx.c...

su find == gnu et xargs idem :

find . ( -name '*.htm*' -o -name '*.php*' -o '*.css*' )
-prune -o -print0 | xargs -0 rm -f


xargs -r0 pour que ce soit une alternative a -exec +.

ce qui permet de traiter les fichiers avec des blancs dans le nom.


Des blancs ou des quotes ou des backslashes ou des chemins trop
long.

PS : l'interret du -prune est que s'il existe un répertoire en .htm
tout son contenu ne sera pas traité, sinon, je vous laisse voir ce
qui ce passe :)
[...]


Ca ne faisait pas partie des requirements.

--
Stéphane



Avatar
Jacques L'helgoualc'h
Le 14-03-2008, Stephane Chazelas a écrit :
2008-03-13, 23:29(+01), Cyrille Lefevre:
[...]

PS : l'interret du -prune est que s'il existe un répertoire en .htm
tout son contenu ne sera pas traité, sinon, je vous laisse voir ce
qui ce passe :)
[...]


Ca ne faisait pas partie des requirements.


La question ne parle pas de sous-arborescence, mais si la réponse est
utilisée dans le but plus général de nettoyer un (sous-)site ouaibe, il
vaut mieux ne pas essayer de détruire les répertoires...

Reste à choisir si on précise « -type f » ou « -not -type d » ?
--
Jacques L'helgoualc'h


Avatar
Stephane Chazelas
2008-03-14, 09:14(+00), Jacques L'helgoualc'h:
Le 14-03-2008, Stephane Chazelas a écrit :
2008-03-13, 23:29(+01), Cyrille Lefevre:
[...]

PS : l'interret du -prune est que s'il existe un répertoire en .htm
tout son contenu ne sera pas traité, sinon, je vous laisse voir ce
qui ce passe :)
[...]


Ca ne faisait pas partie des requirements.


La question ne parle pas de sous-arborescence, mais si la réponse est
utilisée dans le but plus général de nettoyer un (sous-)site ouaibe, il
vaut mieux ne pas essayer de détruire les répertoires...

Reste à choisir si on précise « -type f » ou « -not -type d » ?


C'est un autre probleme, mais de toutes facons, rm -f ne
supprime pas les répertoires.

Note que -not n'est pas standard, lui preferer !

--
Stéphane



Avatar
Jacques L'helgoualc'h
Le 14-03-2008, Stephane Chazelas a écrit :
2008-03-14, 09:14(+00), Jacques L'helgoualc'h:
[...]

Reste à choisir si on précise « -type f » ou « -not -type d » ?


C'est un autre probleme, mais de toutes facons, rm -f ne
supprime pas les répertoires.


Oui, mais autant être prudent, il se trouvera bien un lecteur impétueux
ou étourdi pour passer à « rm -r ».

L'option -f n'est pas (toujours ?) nécessaire :

~ $ type rm
rm is aliased to `rm -iv '

...mais (GNU)find appelle directement /bin/rm :

~ $ find bac_a_sable/ -type f -exec rm -v {} +
détruit `bac_a_sable/vga_1105.jpg'
[...]
~ $ find bac_a_sable/ -exec rm -v {} +
rm: ne peut enlever `bac_a_sable/': est un répertoire


Note que -not n'est pas standard, lui preferer !


Ah oui, merci --- dommage, ça me semble plus lisible, et le shell peut
jouer quelques tours :

~ $ echo ! 
-bash: ! : event not found

--
Jacques L'helgoualc'h


Avatar
Paul Gaborit
À (at) Fri, 14 Mar 2008 10:16:20 +0000 (UTC),
Jacques L'helgoualc'h <lhh+ écrivait (wrote):
~ $ type rm
rm is aliased to `rm -iv '

...mais (GNU)find appelle directement /bin/rm :

~ $ find bac_a_sable/ -type f -exec rm -v {} +
détruit `bac_a_sable/vga_1105.jpg'
[...]


Exemple typique de "mauvais" alias ! L'utilisateur risque d'oublier
(s'il l'a su un jour) que la vraie commande 'rm' ne demande pas de
confirmation.

Il vaut mieux utiliser un autre nom pour l'alias 'rm -i'... Par
exemple 'del'. ;-)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>

1 2 3