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

7 réponses

1 2
Avatar
Nicolas George
Jean-François Garnier
Date: Sun, 03 Apr 2005 19:22:52 +0000
NNTP-Posting-Date: 03 Apr 2005 19:23:45 CEST


Le réglage du fuseau horaire n'est pas correct.

Oui je l'avais mis. Mais ceci n'explique pas le fait que sous tcsh
xargs ne reconnaisse pas l'option -i, d'où le problème de copie de
fichiers.


Il n'y a pas de rapport entre le shell utilisé et le fait que xargs
reconnaisse ou pas l'option -i.

Xargs est-il le même sous GNU/Linux, Solaris ou BSD ?


Non. J'ai même l'impression que ce soit trois versions différentes.

PS : inutile de répondre avec une copie privée dans ce genre de cas.

Avatar
Khanh-Dang
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.


Pour information, donne nous les version de tous les programmes concernés :

tcsh --version
grep --version
xargs --version
cp --version

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





Il semble qu'il y ait une petite confusion entre grep et find...


Tout d'abord qu'est-ce-que "montemplate" ? un motif du shell (du type
a*.txt) ou une expression rationnelle (comme ^a.*.txt$) ?


Si c'est un motif du shell, il faut employer
find . -name "template" -exec cp -f {} ;
(mais attention, on différencie les majuscules des minuscules)


Si c'est une expression rationnelle, on peut utiliser
find . | xargs grep -i "template" |
while read; do cp $REPLY /mesresultats; done
(moins élégant, mais l'option -r de grep n'est pas portable)

--
Christophe Blaess
http://www.blaess.fr/christophe/


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




(j'ai moi même écrit cette ligne...)

Il semble qu'il y ait une petite confusion entre grep et find...


Effectivement :-/ On va mettre ça sur le compte de la nuit blanche dernière.



Avatar
Jean-François Garnier
Nicolas George wrote:
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 je l'avais mis. Mais ceci n'explique pas le fait que sous tcsh
xargs ne reconnaisse pas l'option -i, d'où le problème de copie de
fichiers. Xargs est-il le même sous GNU/Linux, Solaris ou BSD ? Car au
regard de la man page il semble qu'il soit compatible posix 2 en ce qui
me concerne (FreeBSD5.3).
J'ai toujours l'erreur xargs {} no such file or directory, avec -I.
Alors qu'auparavant il apparaissait -i illégal option.
Je me mélange les pinceaux, mon initiation aux scripts est plus que
laborieuse.
Merci pour ta contribution pour tenter de résoudre mon problème.

J-F Garnier



Avatar
Jean-François Garnier
Pascal Bourguignon wrote:
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


Encore désolé mais ça marche pas, erreur de synthaxe while.

Je vais finir par croire que je tente un truc de fou qui n'est pas
réalisable.
En tout les cas merci pour le mal que vous vous donnez à résoudre un
problème qui n'est pas le votre.

J-F Garnier




Avatar
Pascal Bourguignon
Jean-François Garnier writes:

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

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

Encore désolé mais ça marche pas, erreur de synthaxe while.



As tu bien commencé par taper:

bash RETURN

avant de taper ces commandes?

Je vais finir par croire que je tente un truc de fou qui n'est pas
réalisable.


Oui, avec tcsh, c'est assez délicat...

En tout les cas merci pour le mal que vous vous donnez à résoudre un
problème qui n'est pas le votre.


--
__Pascal Bourguignon__ http://www.informatimago.com/


1 2