find et negation de regex

Le
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)
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Stephane Chazelas
Le #1571484
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

Jacques L'helgoualc'h
Le #1571483
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

Jacques L'helgoualc'h
Le #1571482
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

moinsdespam
Le #1571481
Dans
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))

Cyrille Lefevre
Le #1581774
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.


Stephane Chazelas
Le #1581773
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



Jacques L'helgoualc'h
Le #1581772
Le 14-03-2008, Stephane Chazelas
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


Stephane Chazelas
Le #1581771
2008-03-14, 09:14(+00), Jacques L'helgoualc'h:
Le 14-03-2008, Stephane Chazelas
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



Jacques L'helgoualc'h
Le #1581770
Le 14-03-2008, Stephane Chazelas
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


Paul Gaborit
Le #1581769
À (at) Fri, 14 Mar 2008 10:16:20 +0000 (UTC),
Jacques L'helgoualc'h
~ $ 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 -
Publicité
Poster une réponse
Anonyme