OVH Cloud OVH Cloud

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-14, 10:16(+00), 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
[...]


Oui mais le rm -f n'est pas pour ca. D'ailleurs il y a des rm
pour qui -f n'annulle pas -i

$ chmod 0 a
$ /bin/rm a
/bin/rm: remove write-protected regular file `a'?


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
[...]


Mais en l'occurrence, pour find, tu n'auras pas ce probleme, a
moins de vraiment chercher comme dans:

find . !> find.out -name '*.txt' -exec rm -f {} +

Vu que le ! est forcement suivi d'un autre argument.

--
Stéphane



Avatar
Jacques L'helgoualc'h
Le 14-03-2008, Paul Gaborit a écrit :

À (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.


Ben oui --- ce n'est pas le mien, en fait, mais un truc qui traîne dans
trop de configurations par défaut.

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


ou « suppr » ?

Retour à find, sur une ligne : à quoi sert

alias XXXX='find ~/.maildirs/com/ -type f -mtime -14 -exec
grep --color=none -m1 -howE "[0-9][A-Z][0-9]{11}" {} + '

?

--
Jacques L'helgoualc'h


Avatar
Jacques L'helgoualc'h
Le 14-03-2008, Stephane Chazelas a écrit :
2008-03-14, 10:16(+00), Jacques L'helgoualc'h:
~ $ echo ! 
-bash: ! : event not found
[...]


Mais en l'occurrence, pour find, tu n'auras pas ce probleme, a
moins de vraiment chercher comme dans:

find . !> find.out -name '*.txt' -exec rm -f {} +

Vu que le ! est forcement suivi d'un autre argument.


Bah oui, mais j'ai déjà eu des choses un peu surprenantes avec un point
d'exclamation, éventuellement assorti d'une faute de frappe :

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

Avec find, j'essaie d'abord « ... -exec echo rm ... » quand ça se
complique (je sais que tu préfères printf :).
--
Jacques L'helgoualc'h


Avatar
Paul Gaborit
À (at) Fri, 14 Mar 2008 11:20:44 +0000 (UTC),
Jacques L'helgoualc'h <lhh+ écrivait (wrote):
Le 14-03-2008, Paul Gaborit a écrit :
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.


Ben oui --- ce n'est pas le mien, en fait, mais un truc qui traîne dans
trop de configurations par défaut.


Ici, c'est pareil. Et pourtant il ne fait pas partie des alias que
nous installons par défaut. ;-)

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


ou « suppr » ?


À non ! C'est moins drôle : ce n'est pas une commande DOS ! ;-)

(désolé pour le HS...)

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


Avatar
mpg
Le (on) vendredi 14 mars 2008 12:20, Jacques L'helgoualc'h a écrit (wrote) :

Ben oui --- ce n'est pas le mien, en fait, mais un truc qui traîne dans
trop de configurations par défaut.

Je confirme. Et je dois préciser qu'à une époque, ne connaissant pas unalias

et ne sachant pas éditer mon .bashrc à la fac (je débutais sous Unix),
j'avais pris l'habitude de systématiquement utiliser rm -f (sans doute pire
que de répondre 'y' sans réfléchir ou de croire que ça va toujours
demander)...

Manuel.

Avatar
Jacques L'helgoualc'h
Le 14-03-2008, Paul Gaborit a écrit :
À (at) Fri, 14 Mar 2008 11:20:44 +0000 (UTC),
Jacques L'helgoualc'h écrivait (wrote):
Le 14-03-2008, Paul Gaborit a écrit :
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.


Ben oui --- ce n'est pas le mien, en fait, mais un truc qui traîne dans
trop de configurations par défaut.


Ici, c'est pareil. Et pourtant il ne fait pas partie des alias que
nous installons par défaut. ;-)


Bon, c'est vraiment l'utilisateur le coupable, alors...

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


ou « suppr » ?


À non ! C'est moins drôle : ce n'est pas une commande DOS ! ;-)


...mais c'est ce qui est écrit sur ma touche DEL. Le DOS, je commence à
oublier, n'essaie pas de me pervertir ! :) --- je ne sais plus où j'ai
lu qu'on est passé du bon côté quand on tape « ls » ou « rm » sous DOS.

(désolé pour le HS...)


Pas de quoi.
--
Jacques L'helgoualc'h



Avatar
Matthieu Moy
Jacques L'helgoualc'h <lhh+ writes:

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


Oui, mais là, c'est l'espace insécable que tu as mis derrière le ! qui
pose problème, pas le ! lui-même ;-).

--
Matthieu

Avatar
Jacques L'helgoualc'h
Le 14-03-2008, Matthieu Moy a écrit :
Jacques L'helgoualc'h <lhh+ writes:

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


Oui, mais là, c'est l'espace insécable que tu as mis derrière le ! qui
pose problème, pas le ! lui-même ;-).


Oui et non, un brave espace insécable dans une chaîne de caractères a
l'air bien innocent, c'est le point d'exclamation qui, même entre
doubles quotes, est interprété par le shell --- suivant ce que tu as
tapé (même longtemps) avant, ça peut donner des erreurs bizarres.

C'est vrai que ça arrive plus souvent après un pipe, mais on peut
(volontairment ou pas :) enfoncer la touche AltGr en passant du point
d'exclamation à la barre d'espace.
--
Jacques L'helgoualc'h


Avatar
Matthieu Moy
Jacques L'helgoualc'h <lhh+ writes:

Le 14-03-2008, Matthieu Moy a écrit :
Jacques L'helgoualc'h <lhh+ writes:

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


Oui, mais là, c'est l'espace insécable que tu as mis derrière le ! qui
pose problème, pas le ! lui-même ;-).


Oui et non, un brave espace insécable dans une chaîne de caractères a
l'air bien innocent, c'est le point d'exclamation qui, même entre
doubles quotes, est interprété par le shell --- suivant ce que tu as
tapé (même longtemps) avant, ça peut donner des erreurs bizarres.


D'accord sur le fait que le point d'exclamation peut être
problématique, mais sur l'exemple ci-dessus, ce n'est pas le cas.

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

(pour clarifier les choses, je remplace l'espace insécable par X :
$ echo !X
bash: !X: event not found
)

--
Matthieu



Avatar
Jacques L'helgoualc'h
Le 14-03-2008, Matthieu Moy a écrit :
Jacques L'helgoualc'h <lhh+ writes:

Le 14-03-2008, Matthieu Moy a écrit :
Jacques L'helgoualc'h <lhh+ writes:

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


Oui, mais là, c'est l'espace insécable que tu as mis derrière le ! qui
pose problème, pas le ! lui-même ;-).


Oui et non, un brave espace insécable dans une chaîne de caractères a
l'air bien innocent, c'est le point d'exclamation qui, même entre
doubles quotes, est interprété par le shell --- suivant ce que tu as
tapé (même longtemps) avant, ça peut donner des erreurs bizarres.


D'accord sur le fait que le point d'exclamation peut être
problématique, mais sur l'exemple ci-dessus, ce n'est pas le cas.

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

(pour clarifier les choses, je remplace l'espace insécable par X :
$ echo !X
bash: !X: event not found
)


Oui, c'est juste un exemple --- je n'aime pas trop utiliser le point
d'exclamation, car

- il est plus ou moins actif pour le shell ;

- contrairement au dollar, il apparaît assez naturellement dans un
message en français :

Si, en suivant les bons conseils de Paul, tu définis

alias Supprimer='rm -rf '

en élaborant un peu un scénario catastrophe, une expression du genre

"Il faut travailler ! Supprimer ... !"

peut avoir des effets inattendus après une faute de frappe.
--
Jacques L'helgoualc'h




1 2 3