Je cherche une méthode pour obtenir à partir d'une liste donnée de
fichiers (de type 'texte'), ceux qui contiennent (je dis bien 'qui
contiennent' et pas 'dont le nom contient') simultanément plusieurs
chaînes de caractères qui seraient passées en arguments au lancement du
script;
donc quelque chose du genre:
nomduscript chaine1 chaine2 chaine3 ...
renverrait la sous-liste (issue de la liste principale) des fichiers qui
contiennent TOUS les arguments passés (chaine1 ET chaine2 ET chaine3
...).
Je m'en sors actuellement de cette façon:
for arg in ${@}
do
cat ${LISTE_FICHIERS} | while read LIGNE
do
grep -m 1 -li $arg ${LIGNE} >> $LISTE_NEW
done
mv $LISTE_NEW $LISTE_FICHIERS
done
cat $LISTE_FICHIERS | sort | uniq > $LISTE_NEW
mv $LISTE_NEW $LISTE_FICHIERS
donc en faisant autant de boucles de lecture de chaque nouvelle sous-
liste qu'il y a d'arguments passés.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Marc Boyer
Le 23-01-2012, s.gar a écrit :
bonjour,
Je cherche une méthode pour obtenir à partir d'une liste donnée de fichiers (de type 'texte'), ceux qui contiennent (je dis bien 'qui contiennent' et pas 'dont le nom contient') simultanément plusieurs chaînes de caractères qui seraient passées en arguments au lancement du script; donc quelque chose du genre:
nomduscript chaine1 chaine2 chaine3 ...
renverrait la sous-liste (issue de la liste principale) des fichiers qui contiennent TOUS les arguments passés (chaine1 ET chaine2 ET chaine3 ...).
Je m'en sors actuellement de cette façon:
for arg in ${@} do cat ${LISTE_FICHIERS} | while read LIGNE do grep -m 1 -li $arg ${LIGNE} >> $LISTE_NEW done mv $LISTE_NEW $LISTE_FICHIERS done cat $LISTE_FICHIERS | sort | uniq > $LISTE_NEW mv $LISTE_NEW $LISTE_FICHIERS
donc en faisant autant de boucles de lecture de chaque nouvelle sous- liste qu'il y a d'arguments passés.
Je vois pas trop comment faire mieux. Par contre, je vois pas à quoi sert le couple sort|uniq puisque grep -m 1 devrait ne devrait voir chaque fichier qu'une seule fois. Les usages de cat semblent inutiles.
Marc Boyer -- À mesure que les inégalités regressent, les attentes se renforcent. François Dubet
Le 23-01-2012, s.gar <sght.cvf@wanadoo.fr> a écrit :
bonjour,
Je cherche une méthode pour obtenir à partir d'une liste donnée de
fichiers (de type 'texte'), ceux qui contiennent (je dis bien 'qui
contiennent' et pas 'dont le nom contient') simultanément plusieurs
chaînes de caractères qui seraient passées en arguments au lancement du
script;
donc quelque chose du genre:
nomduscript chaine1 chaine2 chaine3 ...
renverrait la sous-liste (issue de la liste principale) des fichiers qui
contiennent TOUS les arguments passés (chaine1 ET chaine2 ET chaine3
...).
Je m'en sors actuellement de cette façon:
for arg in ${@}
do
cat ${LISTE_FICHIERS} | while read LIGNE
do
grep -m 1 -li $arg ${LIGNE} >> $LISTE_NEW
done
mv $LISTE_NEW $LISTE_FICHIERS
done
cat $LISTE_FICHIERS | sort | uniq > $LISTE_NEW
mv $LISTE_NEW $LISTE_FICHIERS
donc en faisant autant de boucles de lecture de chaque nouvelle sous-
liste qu'il y a d'arguments passés.
Je vois pas trop comment faire mieux.
Par contre, je vois pas à quoi sert le couple sort|uniq
puisque grep -m 1 devrait ne devrait voir chaque fichier qu'une
seule fois.
Les usages de cat semblent inutiles.
Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Je cherche une méthode pour obtenir à partir d'une liste donnée de fichiers (de type 'texte'), ceux qui contiennent (je dis bien 'qui contiennent' et pas 'dont le nom contient') simultanément plusieurs chaînes de caractères qui seraient passées en arguments au lancement du script; donc quelque chose du genre:
nomduscript chaine1 chaine2 chaine3 ...
renverrait la sous-liste (issue de la liste principale) des fichiers qui contiennent TOUS les arguments passés (chaine1 ET chaine2 ET chaine3 ...).
Je m'en sors actuellement de cette façon:
for arg in ${@} do cat ${LISTE_FICHIERS} | while read LIGNE do grep -m 1 -li $arg ${LIGNE} >> $LISTE_NEW done mv $LISTE_NEW $LISTE_FICHIERS done cat $LISTE_FICHIERS | sort | uniq > $LISTE_NEW mv $LISTE_NEW $LISTE_FICHIERS
donc en faisant autant de boucles de lecture de chaque nouvelle sous- liste qu'il y a d'arguments passés.
Je vois pas trop comment faire mieux. Par contre, je vois pas à quoi sert le couple sort|uniq puisque grep -m 1 devrait ne devrait voir chaque fichier qu'une seule fois. Les usages de cat semblent inutiles.
Marc Boyer -- À mesure que les inégalités regressent, les attentes se renforcent. François Dubet
Lucas Levrel
Le 23 janvier 2012, s.gar a écrit :
Je m'en sors actuellement de cette façon:
for arg in ${@} do cat ${LISTE_FICHIERS} | while read LIGNE do grep -m 1 -li $arg ${LIGNE} >> $LISTE_NEW
-m 1 est inutile avec -l (d'après le man). Il y aura probablement un problème avec les noms de fichiers à espace.
Il y aura probablement un problème avec les noms de fichiers à espace.
Le script bash me sert à retrouver mes infos dans mes multiples fichiers texte de prises de note rapides. S'agissant donc de fichiers qui m'appartiennent, je prend soin de ne jamais donner de noms de fichiers avec espaces ou autres caractères 'hors-norme'. Toutefois, je suis pour l'usage (avec précaution) des 2 commandes successives: detox -r $CHEMIN/* convmv -r --lower --notest $CHEMIN/*
Depuis que j'utilise cette méthode, mes noms de fichiers sont 'normalisés' ce qui n'a que des avantages.
sort -u -o $LISTE_NEW $LISTE_FICHIERS
-u est-il bien utile ?
Effectivement, ne sert à rien.
Merci encore
bonne journée,
Lucas Levrel wrote:
-m 1 est inutile avec -l (d'après le man).
J'en prend bonne note. Merci.
Il y aura probablement un problème avec les noms de fichiers à espace.
Le script bash me sert à retrouver mes infos dans mes multiples fichiers
texte de prises de note rapides.
S'agissant donc de fichiers qui m'appartiennent, je prend soin de ne
jamais donner de noms de fichiers avec espaces ou autres caractères
'hors-norme'.
Toutefois, je suis pour l'usage (avec précaution) des 2 commandes
successives:
detox -r $CHEMIN/*
convmv -r --lower --notest $CHEMIN/*
Depuis que j'utilise cette méthode, mes noms de fichiers sont
'normalisés' ce qui n'a que des avantages.
Il y aura probablement un problème avec les noms de fichiers à espace.
Le script bash me sert à retrouver mes infos dans mes multiples fichiers texte de prises de note rapides. S'agissant donc de fichiers qui m'appartiennent, je prend soin de ne jamais donner de noms de fichiers avec espaces ou autres caractères 'hors-norme'. Toutefois, je suis pour l'usage (avec précaution) des 2 commandes successives: detox -r $CHEMIN/* convmv -r --lower --notest $CHEMIN/*
Depuis que j'utilise cette méthode, mes noms de fichiers sont 'normalisés' ce qui n'a que des avantages.
sort -u -o $LISTE_NEW $LISTE_FICHIERS
-u est-il bien utile ?
Effectivement, ne sert à rien.
Merci encore
bonne journée,
yamo'
Le 23/01/2012 16:06, s.gar a écrit:
Je cherche une méthode pour obtenir à partir d'une liste donnée de fichiers (de type 'texte'), ceux qui contiennent (je dis bien 'qui contiennent' et pas 'dont le nom contient') simultanément plusieurs chaînes de caractères qui seraient passées en arguments au lancement du script; donc quelque chose du genre:
nomduscript chaine1 chaine2 chaine3 ...
find /quelquepart -type f | xargs grep '(chaine1|chaine2|chaine3)'
-- Stéphane
Le 23/01/2012 16:06, s.gar a écrit:
Je cherche une méthode pour obtenir à partir d'une liste donnée de
fichiers (de type 'texte'), ceux qui contiennent (je dis bien 'qui
contiennent' et pas 'dont le nom contient') simultanément plusieurs
chaînes de caractères qui seraient passées en arguments au lancement du
script;
donc quelque chose du genre:
nomduscript chaine1 chaine2 chaine3 ...
find /quelquepart -type f | xargs grep '(chaine1|chaine2|chaine3)'
Je cherche une méthode pour obtenir à partir d'une liste donnée de fichiers (de type 'texte'), ceux qui contiennent (je dis bien 'qui contiennent' et pas 'dont le nom contient') simultanément plusieurs chaînes de caractères qui seraient passées en arguments au lancement du script; donc quelque chose du genre:
nomduscript chaine1 chaine2 chaine3 ...
find /quelquepart -type f | xargs grep '(chaine1|chaine2|chaine3)'
-- Stéphane
Nicolas George
yamo' , dans le message <jfmbd0$q6b$, a écrit :
find /quelquepart -type f | xargs grep '(chaine1|chaine2|chaine3)'
Le Monsieur a dit qu'il voulait la liste des fichiers qui contiennent _toutes_ les chaînes, pas _au moins une_.
yamo' , dans le message <jfmbd0$q6b$1@nntp.pasdenom.info>, a écrit :
find /quelquepart -type f | xargs grep '(chaine1|chaine2|chaine3)'
Le Monsieur a dit qu'il voulait la liste des fichiers qui contiennent
_toutes_ les chaînes, pas _au moins une_.