OVH Cloud OVH Cloud

grep et cp

17 réponses
Avatar
FreeSBIE User
Bonjour,
Débutant sous tcsh, je cherche un moyen de combiner les
commandes grep et cp sous la forme suivante

grep -r -i montemplate /monpath > cp /monrepertoire/mesresultats

Je pense qu'un script avec variable serait plus adapté mais je sèche et
mes recherches sur google ne m'apportent pas la soluce à mon problème.

Par avance merci pour l'aide ou des renseignements donnés

J-F Garnier

10 réponses

1 2
Avatar
David LE BOURGEOIS
Bonjour,


Bonsoir.

Débutant sous tcsh, je cherche un moyen de combiner les
commandes grep et cp sous la forme suivante

grep -r -i montemplate /monpath > cp /monrepertoire/mesresultats

Je pense qu'un script avec variable serait plus adapté mais je sèche et
mes recherches sur google ne m'apportent pas la soluce à mon problème.


Je pense que l'action voulue est de chercher récursivement dans le
répertoire /monpath tous les fichiers contenant le motif montemplate
(insensiblement à la casse), et de les copier dans le répertoire
/monrepertoire/mesresultats.

Dans ce cas, on peut utiliser quelque chose comme :

$ grep -Z -l -r -i montemplate /monpath
| xargs -0 -i{} -l cp "{}" /mon/repertoire/mesresultats

Pour plus d'infos sur ces commandes : man grep, man xargs.

Par avance merci pour l'aide ou des renseignements donnés


De rien.


--
David LE BOURGEOIS

Le trop de promptitude à l'erreur nous expose.
-+- Pierre Corneille -+-

Avatar
Jean-François Garnier
David LE BOURGEOIS wrote:

Bonjour,



Bonsoir.

Débutant sous tcsh, je cherche un moyen de combiner les
commandes grep et cp sous la forme suivante

grep -r -i montemplate /monpath > cp /monrepertoire/mesresultats

Je pense qu'un script avec variable serait plus adapté mais je sèche et
mes recherches sur google ne m'apportent pas la soluce à mon problème.



Je pense que l'action voulue est de chercher récursivement dans le
répertoire /monpath tous les fichiers contenant le motif montemplate
(insensiblement à la casse), et de les copier dans le répertoire
/monrepertoire/mesresultats.

Dans ce cas, on peut utiliser quelque chose comme :

$ grep -Z -l -r -i montemplate /monpath
| xargs -0 -i{} -l cp "{}" /mon/repertoire/mesresultats

Pour plus d'infos sur ces commandes : man grep, man xargs.

Par avance merci pour l'aide ou des renseignements donnés



De rien.


Encore merci pour le coup de main, mais hélas je n'ai pas obtenu le

résultat escompté, j'obtiens la liste des fichiers à copier puis le
message suivant:
grep: xargs: No such file or directory
grep: cp: No such file or directory
grep: {}: No such file or directory
et retour au prompt!
J'ai bien le défilement des fichiers que je souhaitait copier et je
crois comprendre que c'est à partir de la synthaxe de xargs que ça
coince. Je précise que je suis sous FreeBSD 5.3 mais je ne crois pas
qu'il y a une incidence sur la ligne de commande donnée.

Donc mon problème n'est pas résolu, mais merci tout de même.
Jean-François Garnier


Avatar
Khanh-Dang
Débutant sous tcsh, je cherche un moyen de combiner les
commandes grep et cp sous la forme suivante

grep -r -i montemplate /monpath > cp /monrepertoire/mesresultats


Comme le disait David, je suppose que tu veux copier tous les fichiers
listés par grep dans le répertoire /monrepertoire/mesresultats.

Tu peux regarder la page man de grep au paragraphe concernant l'option
-exec. Tu peux aussi utiliser xargs à travers une pipe, même s'il est
préférable d'utiliser grep avec -exec pour des raisons du nombre limité
d'arguments à passer à une commande.

Tout d'abord, fait un "grep -r -i montemplate /monpath" tout seul pour
vérifier que ça te liste bien tous les bons fichiers.

Ensuite, après lecture de la page man de grep, tu comprendras la commande :
grep -r -i montemplate /monpath -exec cp {} /mesresultats ;

Attention ! Je ne connais pas tcsh et peut-être faut-il aussi avec ce
shell échapper les caractères { et } :

grep -r -i montemplate /monpath -exec cp -f {} /mesresultats ;

Avatar
Pascal Bourguignon
FreeSBIE User writes:

Bonjour,
Débutant sous tcsh, je cherche un moyen de combiner les
commandes grep et cp sous la forme suivante

grep -r -i montemplate /monpath > cp /monrepertoire/mesresultats

Je pense qu'un script avec variable serait plus adapté mais je sèche et
mes recherches sur google ne m'apportent pas la soluce à mon problème.

Par avance merci pour l'aide ou des renseignements donnés


Le problème c'est d'essayer ça avec tcsh...

chsh /bin/bash

ou sinon:

bash -c 'grep -r -i montemplate /monpath |sed -e 's/:.*//''|while read f ; do cp "$f" /monrepertoire/mesresultats ; done'


(En priant pour qu'aucun élément ne contiennent un ':' dans son nom; sinon faire:
bash -c 'find /monpath -depth -name *:* -print | while read f ; do mv "$f" "$(dirname "$f")/$((echo $(basename "$f")|sed -e 's/:/--/g'))" ; done'

)

--
__Pascal Bourguignon__ http://www.informatimago.com/
Until real software engineering is developed, the next best practice
is to develop with a dynamic system that has extreme late binding in
all aspects. The first system to really do this in an important way
is Lisp. -- Alan Kay

Avatar
Nicolas George
Jean-François Garnier
$ grep -Z -l -r -i montemplate /monpath
| xargs -0 -i{} -l cp "{}" /mon/repertoire/mesresultats
^


Encore merci pour le coup de main, mais hélas je n'ai pas obtenu le
résultat escompté, j'obtiens la liste des fichiers à copier puis le
message suivant:
grep: xargs: No such file or directory


As-tu bien mis le « | » comme indiqué ?


Avatar
Jean-François Garnier
Khanh-Dang wrote:

Débutant sous tcsh, je cherche un moyen de combiner les
commandes grep et cp sous la forme suivante

grep -r -i montemplate /monpath > cp /monrepertoire/mesresultats



Comme le disait David, je suppose que tu veux copier tous les fichiers
listés par grep dans le répertoire /monrepertoire/mesresultats.

Tu peux regarder la page man de grep au paragraphe concernant l'option
-exec. Tu peux aussi utiliser xargs à travers une pipe, même s'il est
préférable d'utiliser grep avec -exec pour des raisons du nombre limité
d'arguments à passer à une commande.

Tout d'abord, fait un "grep -r -i montemplate /monpath" tout seul pour
vérifier que ça te liste bien tous les bons fichiers.

Ensuite, après lecture de la page man de grep, tu comprendras la commande :
grep -r -i montemplate /monpath -exec cp {} /mesresultats ;

Attention ! Je ne connais pas tcsh et peut-être faut-il aussi avec ce
shell échapper les caractères { et } :

grep -r -i montemplate /monpath -exec cp -f {} /mesresultats ;


Re-bonjour,

Hélas, Kahnh-Dang, ta soluce, ne me permet toujours pas de remédier au
problème et c'est pas faute de chercher (depuis hier...;-)).
Les fichiers que je cherche comportent bel et bien le template employé

Ton script, même en employant les caractères d'échappement, me donne:
grep: {}: No such file or directory ....surprenant!

J'ai vraiment pas envie de faire un tri "à la main" parmi 3000 fichiers
pour n'en conserver qu'à peine plus d'une centaine. Il est vrai que je
m'obstine à vouloir faire ça en ligne de commande. Ca doit bien être
possible tout de même.

J-F Garnier


Avatar
Pascal Bourguignon
Jean-François Garnier writes:

Pascal Bourguignon wrote:
FreeSBIE User writes:

Bonjour,
Débutant sous tcsh, je cherche un moyen de combiner les
commandes grep et cp sous la forme suivante

grep -r -i montemplate /monpath > cp /monrepertoire/mesresultats

Je pense qu'un script avec variable serait plus adapté mais je sèche et
mes recherches sur google ne m'apportent pas la soluce à mon problème.

Par avance merci pour l'aide ou des renseignements donnés
Le problème c'est d'essayer ça avec tcsh...

chsh /bin/bash
ou sinon:
bash -c 'grep -r -i montemplate /monpath |sed -e 's/:.*//''|while
read f ; do cp "$f" /monrepertoire/mesresultats ; done'
(En priant pour qu'aucun élément ne contiennent un ':' dans son nom;
sinon faire:
bash -c 'find /monpath -depth -name *:* -print | while read f ; do mv "$f" "$(dirname "$f")/$((echo $(basename "$f")|sed -e 's/:/--/g'))" ; done'
)

Merci mais hélas, Pascal, sous Bash, ta commande ne m'apporte guère

plus de résultats positifs, ça plante par:
bash: line 1: unexpected EOF while looking for matching `''


Oui, il y avait une quote en trop. Voici:

bash -c 'grep -r -i montemplate /monpath |sed -e 's/:.*//'|while read f ; do cp "$f" /monrepertoire/mesresultats ; done'

Ou aussi:

bash
grep -r -i montemplate /monpath
| sed -e 's/:.*//'
| while read f ; do
cp "$f" /monrepertoire/mesresultats
done

Je suppose qu'il s'agit d'une erreur de synthaxe ou de frappe clavier
car j'ai effectué cette commande en vérifiant ma frappe.


Et le copier-coller?

J'ai bien l'impression que je suis face à un problème insoluble sous
cette forme, ....et il ne s'agit pourtant pas d'un exercice car je ne
suis pas étudiant mais simplement passionné par le système FreeBSD que
j'essaye d'employer dans mon quotidien. Mais je ne désespère pas d'y
parvenir un jour.


C'est facile de construire des pipes petit à petit. Commencer par la
première commande, et ajouter les commandes une après l'autre. Dans
bash, on peut éditer la commande précédente avec les mêmes séquences
qu'emacs (ou vi si on se le configure ainsi), C-p, C-n, C-a, C-e, C-f,
C-b, C-d, etc.

grep -r -i montemplate /monpath

Puis:

grep -r -i montemplate /monpath | sed -e 's/:.*//'

Puis:

grep -r -i montemplate /monpath | sed -e 's/:.*//' | while read f ; do
echo cp "$f" /monrepertoire/mesresultats
done

Puis:

grep -r -i montemplate /monpath | sed -e 's/:.*//' | while read f ; do
cp "$f" /monrepertoire/mesresultats
done


--
__Pascal Bourguignon__ http://www.informatimago.com/
You never feed me.
Perhaps I'll sleep on your face.
That will sure show you.



Avatar
Jean-François Garnier
Pascal Bourguignon wrote:
FreeSBIE User writes:


Bonjour,
Débutant sous tcsh, je cherche un moyen de combiner les
commandes grep et cp sous la forme suivante

grep -r -i montemplate /monpath > cp /monrepertoire/mesresultats

Je pense qu'un script avec variable serait plus adapté mais je sèche et
mes recherches sur google ne m'apportent pas la soluce à mon problème.

Par avance merci pour l'aide ou des renseignements donnés



Le problème c'est d'essayer ça avec tcsh...

chsh /bin/bash

ou sinon:

bash -c 'grep -r -i montemplate /monpath |sed -e 's/:.*//''|while read f ; do cp "$f" /monrepertoire/mesresultats ; done'


(En priant pour qu'aucun élément ne contiennent un ':' dans son nom; sinon faire:
bash -c 'find /monpath -depth -name *:* -print | while read f ; do mv "$f" "$(dirname "$f")/$((echo $(basename "$f")|sed -e 's/:/--/g'))" ; done'

)

Merci mais hélas, Pascal, sous Bash, ta commande ne m'apporte guère plus

de résultats positifs, ça plante par:
bash: line 1: unexpected EOF while looking for matching `''

Je suppose qu'il s'agit d'une erreur de synthaxe ou de frappe clavier
car j'ai effectué cette commande en vérifiant ma frappe.

J'ai bien l'impression que je suis face à un problème insoluble sous
cette forme, ....et il ne s'agit pourtant pas d'un exercice car je ne
suis pas étudiant mais simplement passionné par le système FreeBSD que
j'essaye d'employer dans mon quotidien. Mais je ne désespère pas d'y
parvenir un jour.

J-F Garnier


Avatar
Pascal Bourguignon
Nicolas George <nicolas$ writes:

Jean-François Garnier
$ grep -Z -l -r -i montemplate /monpath
| xargs -0 -i{} -l cp "{}" /mon/repertoire/mesresultats
^


Encore merci pour le coup de main, mais hélas je n'ai pas obtenu le
résultat escompté, j'obtiens la liste des fichiers à copier puis le
message suivant:
grep: xargs: No such file or directory


As-tu bien mis le « | » comme indiqué ?


Oui. Le à la fin de la ligne fait que les deux lignes sont
concaténées (le en moins);

a
b

==

a b



a
| b

=
a | b


et le | est ce qui permet de rediriger la sortie de la commande à
gauche (a) vers l'entrées de la commande à droite (b).


--
__Pascal Bourguignon__ http://www.informatimago.com/
Small brave carnivores
Kill pine cones and mosquitoes
Fear vacuum cleaner



Avatar
Nicolas George
Pascal Bourguignon wrote in message
:
Oui. Le à la fin de la ligne fait que les deux lignes sont
concaténées (le en moins);


Oui, et ses messages d'erreur semblaient indiquer que grep cherchait un
fichier appelé xargs, donc que le était bien là, et pas le |.

1 2