Pages : 1
#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
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)
Dernière modification par nesthib (Le 25/02/2009, à 12:41)
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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 )
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
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
@ 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"
Et puis je suis pas le seul à faire des fautes : "une erreur s'est glissée" (je rigole, ne le prend pas mal)
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
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> )
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
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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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
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"
Et puis je suis pas le seul à faire des fautes : "une erreur s'est glissée" (je rigole, ne le prend pas mal)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
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
Pages : 1