2 votes

J'ai besoin de déplacer les fichiers trouvés avec grep dans un dossier.

Dans le cadre d'un cours universitaire, j'essaie de rechercher de manière exclusive une chaîne de caractères dans une liste de 500 fichiers, puis de copier les éléments trouvés dans un nouveau dossier.

Je peux trouver les fichiers sans problème en utilisant

grep -rnw '/home/steve/Desktop.CEDFOR.arnold-j/sent/' -e 'vladimir.gorny@enron.com'

Cependant, lorsque j'essaie d'acheminer les résultats vers un dossier appelé Suspicious, un message d'erreur s'affiche.

Le code complet que j'utilise (basé sur un problème similaire signalé il y a quelques années) est le suivant

grep -rnw '/home/steve/Desktop.CEDFOR.arnold-j/sent/' -e 'vladimir.gorny@enron.com' | xargs -0 cp -t /home/steve/Desktop/CEDFOR/arnold-j/Suspicious/

Cependant, l'erreur indique qu'un tel dossier ou fichier n'existe pas. Je peux confirmer que le dossier /home/steve/Desktop/CEDFOR/arnold-j/Suspicious/ est bien là.

Pour clarifier... Je veux copier les fichiers dans le dossier "Suspicieux", pour les examiner ultérieurement.

Où me suis-je trompé ?

5voto

pLumo Points 23269

Votre grep devrait être différent, il a besoin :

  • -l, --files-with-matches imprimer seulement les noms de fichiers, pas les lignes correspondantes
  • -Z, --null Comme votre xargs lit la sortie délimitée par zéro en raison de -0 ce qui est une bonne idée, vous devez également fournir sortie zéro-délimitée avec ajout -Z à votre grep commandement.
  • -F, --fixed-strings Comme vous avez une chaîne de caractères fixe au lieu d'un motif, vous devez utiliser la fonction -F . Si ce n'est pas le cas, votre "motif" correspondra également, par exemple, à l'expression suivante vladimirXgorny@enron+com comme . signifie tout caractère en regex. Aussi -F sera beaucoup plus rapide !

Il n'en a pas besoin :

  • -n imprime les numéros de ligne des correspondances, mais ce qui devrait xargs faire avec ?

Il faut le changer :

  • Bien qu'elle fonctionne, votre commande doit être modifiée afin de prendre en compte le format du Synopsis, afin d'être sûr qu'elle fonctionnera avec différentes versions de grep aussi. (comparer man grep ).

    grep [OPTION...] -e PATTERNS ... [FILE...]

    Ce qui signifie que votre fichier (ou dans votre cas le chemin) doit être placé après -e ... .

Donc, votre commande complète serait la suivante :

grep -rlZFw -e 'vladimir.gorny@enron.com' '/home/steve/Desktop/CEDFOR/arnold-j/sent/'

ou vous pouvez laisser de côté -e pour correspondre au premier formulaire SYNOPSIS :

grep -rlZFw 'vladimir.gorny@enron.com' '/home/steve/Desktop/CEDFOR/arnold-j/sent/'

Votre xargs me semble bien, mais vous devriez envisager d'ajouter -r, --no-run-if-empty pour éviter les erreurs lorsque grep ne trouve pas de fichier correspondant.

Et pour votre cp c'est une bonne habitude d'ajouter -- de dire cp que aucune option ne suit . Sinon, les noms de fichiers commençant par - pourrait causer des problèmes.

xargs -0r cp -t /home/steve/Desktop/CEDFOR/arnold-j/Suspicious/ --

Au total :

grep -rlZFw 'vladimir.gorny@enron.com' '/home/steve/Desktop/CEDFOR/arnold-j/sent/' \
| xargs -0r cp -t /home/steve/Desktop/CEDFOR/arnold-j/Suspicious/ --

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X