Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/02/2009, à 21:09

madjuju

[RESOLU] Combinaison de rgrep et de find

Bonjour j'ai 85000 fichiers
je souhaite rechercher dans chaque fichier si le text "blablabla" est présent et si il est présent déplacer le fichier dans mon répertoire /home/saveblablabla

Pouvez vous m'aider ?

Madjuju

Dernière modification par madjuju (Le 26/02/2009, à 13:41)


Quad Core 6600 G0 - P5K asus - 2048 DDR2 CORSAIR 8500- nvidia 8600 PCIE
Ubuntu 8.04 - 1 X 250 GO SATA - 1 X 500 GO SATA II et
P4 HT - Asus P5GD2 premium - 1 X 250 GO SATA Ubuntu 8.04
Nvidia asus 6600 GT

Hors ligne

#2 Le 24/02/2009, à 23:05

schaars

Re : [RESOLU] Combinaison de rgrep et de find

Bonsoir

Moi je ferais plutôt un for avec un grep :

for i in *
do
   grep blablabla "$i"
   if [ $? == 0 ]        # blablabla est présent dans $i, code de retour de grep
   then
      mv "$i" /home/saveblablabla/
   done
done

Ça ça marche si il faut juste chercher dans un seul répertoire, et pas dans les sous répertoires. Pour chercher de partout, tu peux faire un script (monscript.sh) qui contient le grep, le if et le mv (comme au dessus) et tu l'appelles avec find sur chacun des fichiers. Je n'ai pas testé mais ça donnerais quelque chose comme ça :

$ cat monscript.sh
grep blablabla "$1"
if [ $? == 0 ]
then
   mv "$i" /home/saveblablabla/
done
$ find /le/repertoire/ou/chercher -exec monscript.sh {} \;

Dernière modification par schaars (Le 24/02/2009, à 23:09)


Le linux des uns est l'OS/2 des autres (Thom E. Gemcity)

Hors ligne

#3 Le 25/02/2009, à 00:33

AnsuzPeorth

Re : [RESOLU] Combinaison de rgrep et de find

Bsr,

Ou alors, recherche recursive (à controler):

ITEM="MotRecherche"
 grep -Rl $ITEM /dossier/de/recherche | while read ligne ; do mv "$ligne" $HOME/save$ITEM ; done

Dernière modification par AnsuzPeorth (Le 25/02/2009, à 00:38)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#4 Le 25/02/2009, à 01:12

nesthib

Re : [RESOLU] Combinaison de rgrep et de find

Salut,
ma solution n'est surement pas la plus optimale, mais ici tu gardes l'arborescence des fichiers, comme ça tu as le choix big_smile

le "if cat ... | grep -q ..." est pratique pour effectuer une tâche sur un fichier suivant une condition

#!/bin/bash
SOURCE=/home/...
PROFONDEUR=10            #Pour limiter la profondeur de parcours des dossiers
CIBLE=/home/saveblabla
TEXTE=blabla

for i in `find $SOURCE -mindepth 1 -maxdepth $PROFONDEUR -type f -print`    #liste tous les fichiers (récursif sur $PROFONDEUR)
do
		if cat $i | grep -q $TEXTE
			then
			cp --parents $i $CIBLE && rm $i       #ou si tu ne veux pas l'arborescence : mv $i $CIBLE
		fi
done

EDIT : petite correction et amélioration, j'ai testé ça à l'air de bien fonctionner
Tiens nous au courant (notamment si tu as l'occaz de tester la vitesse d'exécution) wink

Dernière modification par nesthib (Le 25/02/2009, à 12:41)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#5 Le 25/02/2009, à 11:01

madjuju

Re : [RESOLU] Combinaison de rgrep et de find

Merci a tous pour vos réponses

je test ce soir et vous tiens informé

juju:D


Quad Core 6600 G0 - P5K asus - 2048 DDR2 CORSAIR 8500- nvidia 8600 PCIE
Ubuntu 8.04 - 1 X 250 GO SATA - 1 X 500 GO SATA II et
P4 HT - Asus P5GD2 premium - 1 X 250 GO SATA Ubuntu 8.04
Nvidia asus 6600 GT

Hors ligne

#6 Le 25/02/2009, à 17:09

AnsuzPeorth

Re : [RESOLU] Combinaison de rgrep et de find

Bon, je m'emmer... alors j'ai testé le temps d'execution de chaque (curiosité....!)
La commande mv (mv et rm pour nesthib) sont 'englobé' dans un echo (juste pour afficher le resultat, ne pas executer la commande)
@ nesthib : les résultat devraient etre encore moins bon, car tu as 2 commande (rm et mv englobé), de plus les espaces dans les noms de fichiers empechent le traitement (même protégé...! Enfin, j'ai pas trop cherché non plus smile)

 real 0m0.548s
 user 0m0.352s
 sys 0m0.312s

@ schaars (je pensais que le résultat serait plus mauvais....Par contre une erreur c'est glisser, tu as mis un done au lieu d'un fi)

 real 0m0.100s
 user 0m0.068s
 sys 0m0.040s

@ AnsuzPeorth

 real 0m0.148
 user 0m0.012s
 sys 0m0.004s

Par contre, je sais pas trop a quoi correspond real, user, sys (j'en ai une vague idée, mais je veux pas dire de conneries).
La commande utilisé est time pour savoir le temps d'execution.


Voilà, ca sert à rien, mais ca passe le temps...:)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#7 Le 25/02/2009, à 19:01

grouby

Re : [RESOLU] Combinaison de rgrep et de find

plus simple en une ligne:

find . -exec grep -E "blablabla" {} ';' -print -exec cp {} rep_de_destination/ ';'


ps: le find est recursif et cherche dans tous les sous-repertoires.

sinon pour limiter a 2 niveau par exemple, il faut ajouter  -maxdepth 2

#8 Le 25/02/2009, à 19:04

grouby

Re : [RESOLU] Combinaison de rgrep et de find

heu, en relisant la question, si c'est pour deplacer, c'est mv:

find . -exec grep -E "blablabla" {} ';' -print -exec mv {} rep_de_destination/ ';'

--------
hope this help ;-)

#9 Le 25/02/2009, à 19:15

AnsuzPeorth

Re : [RESOLU] Combinaison de rgrep et de find

J'avais jamais vu utiliser find comme cela.....

le -print est là pour réinjecter l'entrée ?

Merci, encore un truc apprit smile


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#10 Le 25/02/2009, à 20:09

grouby

Re : [RESOLU] Combinaison de rgrep et de find

non le -print, c'est que de l'affichage dans la console, c'est pour tracer


                     action1                  A                  action2 B
find . -exec grep -E "blablabla" {} ';' -print -exec mv {} rep_de_destination/ ';'

find .  : renvoi tout les fichiers recursivement du repertoire courant

quand tu fais un exec, le resultat de la commande precedente se trouve dans {}

tu as ici donc le grep sur "l'ensemble resultat " du find (=A), qui cree donc un  "ensemble resultat B"

le deuxieme exec utilise donc "l'ensemble resultat de l'action1" (=B), donc les fichers qui contiennent blabla et les deplace.

';' marque la fin de la commande

ps: lire le man de find, c'est vraiment une commande de fou tres puissante avec laquelle on peut faire enormement de choses grace a cette histoire d'ensemble.
on peux faire autant de -exec que l'on veut
par contre, si dans un -exec tu met 2 commandes, elles travaillent donc sur le meme ensemble de resultat

#11 Le 25/02/2009, à 20:14

AnsuzPeorth

Re : [RESOLU] Combinaison de rgrep et de find

C'est comme un pipe xargs (que j'ai beaucoup de difficulté a faire marcher d'ailleurs), mais dans find  ?

Intéressant....:)

ps: J'ai deja lu le man plusieurs fois, mais bon.....!

Dernière modification par AnsuzPeorth (Le 25/02/2009, à 20:15)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#12 Le 25/02/2009, à 20:30

schaars

Re : [RESOLU] Combinaison de rgrep et de find

AnsuzPeorth a écrit :

@ schaars (je pensais que le résultat serait plus mauvais....Par contre une erreur c'est glisser, tu as mis un done au lieu d'un fi)

Ouais bon d'accord, c'est pour ça que j'ai mis "Je n'ai pas testé mais ça donnerais quelque chose comme ça" smile
Et puis je suis pas le seul à faire des fautes : "une erreur s'est glissée" (je rigole, ne le prend pas mal) smile

grouby a écrit :

find . -exec grep -E "blablabla" {} ';' -print -exec mv {} rep_de_destination/ ';'

Ça c'est du find ! Et moi aussi j'y arrive pas avec xargs, zsh m'insulte sad


Le linux des uns est l'OS/2 des autres (Thom E. Gemcity)

Hors ligne

#13 Le 25/02/2009, à 21:18

nesthib

Re : [RESOLU] Combinaison de rgrep et de find

Bien vu AnsuzPeorth pour le coup des espaces! (<mauvaise foi> quelle idée aussi de mettre des espaces dans les noms de fichiers </mauvaise foi> big_smile)
Qqun sait comment résoudre ce pb? je ne vois pas comment protéger ces espaces...

@grouby : je ne connaissait pas la possibilité de mettre plusieurs exec, effectivement c'est puissant wink

sinon au départ j'avais essayé de mettre un if/then/fi après le -exec mais j'ai eu une erreur : une idée de comment faire pour mettre une boucle en -exec (sans doute un pb de syntaxe) ?

Dernière modification par nesthib (Le 25/02/2009, à 21:20)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#14 Le 26/02/2009, à 09:22

madjuju

Re : [RESOLU] Combinaison de rgrep et de find

Vous êtes au top

j'ai pas pu essayer hier soir

je vous tiens informer

n'oubliez pas "RGREP"


Quad Core 6600 G0 - P5K asus - 2048 DDR2 CORSAIR 8500- nvidia 8600 PCIE
Ubuntu 8.04 - 1 X 250 GO SATA - 1 X 500 GO SATA II et
P4 HT - Asus P5GD2 premium - 1 X 250 GO SATA Ubuntu 8.04
Nvidia asus 6600 GT

Hors ligne

#15 Le 26/02/2009, à 12:41

madjuju

Re : [RESOLU] Combinaison de rgrep et de find

schaars a écrit :
AnsuzPeorth a écrit :

@ schaars (je pensais que le résultat serait plus mauvais....Par contre une erreur c'est glisser, tu as mis un done au lieu d'un fi)

Ouais bon d'accord, c'est pour ça que j'ai mis "Je n'ai pas testé mais ça donnerais quelque chose comme ça" smile
Et puis je suis pas le seul à faire des fautes : "une erreur s'est glissée" (je rigole, ne le prend pas mal) smile

grouby a écrit :

find . -exec grep -E "blablabla" {} ';' -print -exec mv {} rep_de_destination/ ';'

Ça c'est du find ! Et moi aussi j'y arrive pas avec xargs, zsh m'insulte sad

Ca tourne

j'ai mis un petit "time" en début de ligne

je vous tiens informé

Dernière modification par madjuju (Le 26/02/2009, à 12:42)


Quad Core 6600 G0 - P5K asus - 2048 DDR2 CORSAIR 8500- nvidia 8600 PCIE
Ubuntu 8.04 - 1 X 250 GO SATA - 1 X 500 GO SATA II et
P4 HT - Asus P5GD2 premium - 1 X 250 GO SATA Ubuntu 8.04
Nvidia asus 6600 GT

Hors ligne

#16 Le 26/02/2009, à 13:41

madjuju

Re : [RESOLU] Combinaison de rgrep et de find

real    60m44.805s
user    2m50.691s
sys    5m3.415s


Nickel merci


Quad Core 6600 G0 - P5K asus - 2048 DDR2 CORSAIR 8500- nvidia 8600 PCIE
Ubuntu 8.04 - 1 X 250 GO SATA - 1 X 500 GO SATA II et
P4 HT - Asus P5GD2 premium - 1 X 250 GO SATA Ubuntu 8.04
Nvidia asus 6600 GT

Hors ligne