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

grep qui renvoie le nom du fichier uniquement

18 réponses
Avatar
Kevin Denis
Bonjour,

je dois trier un très grand nombre de fichiers qui contiennent une
ou plusieurs fois une pattern.

Je fais donc un grep, suivi d'un sort -u pour avoir une fois
uniquement les fichiers.
Est il possible avec grep de donner le nom du fichier une seule fois?

La commande est:
find directory/ -type f -exec grep "pattern" {} \; -print > /tmp/liste

Est il possible de n'avoir que le nom des fichiers comportant
pattern d'une manière plus élégante?
Merci
--
Kevin

8 réponses

1 2
Avatar
Jacques L'helgoualc'h
Le 08-11-2008, Alain Montfranc a écrit :
Jacques L'helgoualc'h a écrit


[...]
find repert/ -type f -name qf* -exec grep -l REGEXP {} + |
sed -re 's,^(.*/)qf([^/]*)$,& 1df2 1Df2,' |
...



Ah non là c'est crade. Ca lance un grep pour chaque fichier !



Ben non, c'est « + » et pas « ; » (GNU find). En principe, c'est
à peu près équivalent à « find ... -print0 ; | xargs -0 grep ... ».


Sinon, Sed pourrait filtrer aussi les noms de fichiers, si on accepte la
craditude de ton grep récursif :)

sed -nre 's,^(.*/)?qf([^/]*)$,& 1df2 1Df2,p'

avec « ? » pour les qf* du répertoire courant parce que grep ne préfixe
pas par ./ comme find.
--
Jacques L'helgoualc'h
Avatar
Freddy DISSAUX
Le Sat, 08 Nov 2008 18:26:35 +0100, Alain écrivait:

[ snip find grep sed xargs ]

Est-ce que cela va finir en production ?
Parce que question lisibilité, c'est un peu moyen moins, non ?

--
freddy <point> dsx <arobase> free <point> fr
Avatar
Benoit Izac
Bonjour,

le 08/11/2008 à 18:58, Jacques L'helgoualc'h a écrit dans le message
<slrnghbkqd.iq6.lhh+ :

Ben non, c'est « + » et pas « ; » (GNU find).



Ce n'est pas propre au find de GNU, c'est POSIX :
<http://www.opengroup.org/onlinepubs/009695399/utilities/find.html>

Mais il est vrai que certain find (dont celui de busybox) ne supportent
pas cette syntaxe.

--
Benoit Izac
Avatar
Jacques L'helgoualc'h
Le 08-11-2008, Benoit Izac a écrit :
Bonjour,



bonjour,

le 08/11/2008 à 18:58, Jacques L'helgoualc'h a écrit dans le message
<slrnghbkqd.iq6.lhh+ :

Ben non, c'est « + » et pas « ; » (GNU find).



Ce n'est pas propre au find de GNU, c'est POSIX :
<http://www.opengroup.org/onlinepubs/009695399/utilities/find.html>

Mais il est vrai que certain find (dont celui de busybox) ne supportent
pas cette syntaxe.



Oui --- j'aurais dû préciser « find » de GNU version 4.2.28, ça ne fait
pas si longtemps que ça marche...
--
Jacques L'helgoualc'h
Avatar
Kevin Denis
Le 08-11-2008, Freddy DISSAUX a écrit :
On récapitule:
- trouver les fichiers dont le contenu match <pattern>
- à partir du nom du fichier, en déduire un autre
- supprimer les deux fichiers



Oui

Un début de réponse:

#!/usr/bin/perl



Hélas, pas de perl sur ma plateforme.
--
Kevin
Avatar
Kevin Denis
Le 08-11-2008, Alain Montfranc a écrit :
On récapitule:
- trouver les fichiers dont le contenu match <pattern>
- à partir du nom du fichier, en déduire un autre
- supprimer les deux fichiers



find directory -type f -print | xargs grep -l pattern | sed
's/qf(.*)/& df1 Df1' | xargs rm -f



D'accord, j'ajouterai un:
find directory -type f -name "qf*" -print pour épurer un peu, mais
j'ai du mal à comprendre le sed

Qu'on peut simplifier (si le grep accepte la recursivité ce qui n'est
pas gagné si je me souviens des messages précédents) :



En fait, à partir d'un grand nombre de fichier, je me suis rendu compte
qu'il vaut mieux démarrer par un find plutôt que tout autre commande.
Par exemple, lorsque le nombre de fichiers dépasse la centaine de mille
un:
ls | wc -l
ne rend jamais la main, alors qu'un
find . -type f | wc -l
est quasi immédiat
--
Kevin
Avatar
Alain Montfranc
Kevin Denis a écrit
Le 08-11-2008, Alain Montfranc a écrit :
On récapitule:
- trouver les fichiers dont le contenu match <pattern>
- à partir du nom du fichier, en déduire un autre
- supprimer les deux fichiers



find directory -type f -print | xargs grep -l pattern | sed
's/qf(.*)/& df1 Df1' | xargs rm -f



D'accord, j'ajouterai un:
find directory -type f -name "qf*" -print pour épurer un peu, mais
j'ai du mal à comprendre le sed



A partir du qfxxxxx ca cree qfxxxxx dfxxxxx Dfxxxxx poyr tout détruire


Qu'on peut simplifier (si le grep accepte la recursivité ce qui n'est
pas gagné si je me souviens des messages précédents) :



En fait, à partir d'un grand nombre de fichier, je me suis rendu compte
qu'il vaut mieux démarrer par un find plutôt que tout autre commande.
Par exemple, lorsque le nombre de fichiers dépasse la centaine de mille
un:
ls | wc -l
ne rend jamais la main, alors qu'un
find . -type f | wc -l
est quasi immédiat




Normal ls fait des tris...
Avatar
Freddy DISSAUX
Le 11 Nov 2008 14:52:58 GMT, Kevin écrivait:
Le 08-11-2008, Freddy DISSAUX a écrit :
On récapitule:
- trouver les fichiers dont le contenu match <pattern>
- à partir du nom du fichier, en déduire un autre
- supprimer les deux fichiers



Oui


Toujours *bien* comprendre le problème avant de faire quoi que ce soit
:)

Un début de réponse:

#!/usr/bin/perl



Hélas, pas de perl sur ma plateforme.


Un *nix avec sendmail mais pas de perl ? FreeBSD ?


--
freddy <point> dsx <arobase> free <point> fr
1 2