web-dev-qa-db-ger.com

Wie kann man die Ausgabe von grep an cp weiterleiten?

Ich habe einen Arbeitsbefehl grep, der Dateien auswählt, die eine bestimmte Bedingung erfüllen. Wie kann ich die ausgewählten Dateien vom Befehl grep nehmen und an einen Befehl cp weiterleiten?

Die folgenden Versuche sind am cp-Ende fehlgeschlagen:

grep -r "TWL" --exclude=*.csv* | cp ~/data/lidar/tmp-ajp2/

cp: Zieldateioperand nach .__ fehlt. "/ Home/ubuntu/data/lidar/tmp-ajp2 /" Versuchen Sie, "cp --help" für mehr Information.


cp `grep -r "TWL" --exclude=*.csv*` ~/data/lidar/tmp-ajp2/

cp: ungültige Option - '7'

21
Borealis
grep -l -r "TWL" --exclude=*.csv* | xargs cp -t ~/data/lidar/tmp-ajp2/

Erläuterung:

  • grep -l Option zur Ausgabe von Dateinamen
  • xargs, um die Dateiliste von der Standardeingabe in Befehlszeilenargumente zu konvertieren
  • cp -t Option zur Angabe des Zielverzeichnisses (und vermeidet die Verwendung von Platzhaltern)
27
kostya

sie benötigen xargs mit der Option Platzhalter :

grep -r "TWL" --exclude=*.csv* | xargs -I '{}' cp '{}' ~/data/lidar/tmp-ajp2/

wenn Sie xargs verwenden, wird normalerweise die Ausgabe after des Befehls eingefügt. Mit dem Platzhalter (in diesem Fall '{}') können Sie sogar mehrmals den Ort auswählen, an dem er eingefügt wird.

16
Chris Maes

Dies funktionierte für mich bei der Suche nach Dateien mit einem bestimmten Datum:

 ls | grep '2018-08-22' | xargs -I '{}' cp '{}' ~/data/lidar/tmp-ajp2/
3
MAbraham1

Um Dateien in grep gefundene Verzeichnisse zu kopieren, verwenden Sie -printf zur Ausgabe von Verzeichnissen und -i, um das Befehlsargument aus xarg (nach Pipe) zu platzieren.

find ./ -name 'filename.*' -print '%h\n' | xargs -i cp copyFile.txt {}

kopiert copyFile.txt in alle Verzeichnisse (in ./), die "Dateiname" enthalten.

0
Jason

grep -rl '/ verzeichnis /' -e 'muster' | xargs cp -t/verzeichnis

0
SomyaThatoi