
Ich bin daran interessiert, in einem Verzeichnis rekursiv nach einem Muster nach einer Zeichenfolge zu suchen und dann die passende Datei per cp in ein Zielverzeichnis zu kopieren. Ich dachte, ich könnte so etwas wie das Folgende tun, aber mit dem Suchtool von Linux scheint das keinen Sinn zu ergeben:
find . -type f -exec grep -ilR "MY PATTERN" | xargs cp /dest/dir
Gibt es einen besseren Weg, dies zu erreichen? Oder einen Weg, der überhaupt funktioniert, wäre ein guter Anfang.
Antwort1
Tun Sie es man xargs
und schauen Sie sich die -I
Flagge an.
find . -type f -exec grep -ilR "MY PATTERN" {} \; | xargs -I % cp % /dest/dir/
Außerdem wird nach der Flagge ein „ oder“ find
erwartet .\;
+
-exec
Antwort2
Ich glaube nicht, dass Sie find brauchen. Rekursives grep:
grep -rl "MY PATTERN" .
Antwort3
xargs
liest seine Standardeingabe und fügt sie am Ende des auszuführenden Befehls ein. So wie Sie es geschrieben haben, würden Sie am Ende ausführen
cp /dest/dir sourcefile1 sourcefile2 sourcefile3
was das Gegenteil von dem ist, was Sie wollen.
Sie können die -I
Option verwenden, um einen Platzhalter für anzugeben xargs
, wie folgt: xargs -I '{}' cp '{}' /dest/dir
.
find
Kümmert sich außerdem um die Rekursion, sodass Sie dies grep
nicht benötigen -R
.
Endgültige Lösung:
find . -type f -exec grep -il "MY PATTERN" '{}' + | xargs -I '{}' cp '{}' /dest/dir
Antwort4
Keines der obigen Beispiele berücksichtigt die Möglichkeit, dass grep
's -l
doppelte Ergebnisse erzeugt (Dateien mit demselben Namen, aber an verschiedenen Orten), und dass daher find
der ' exec
s-Hook Dateien im Zielverzeichnis überschreibt.
Ein Lösungsversuch:
$ tree foo
foo
├── bar
│ ├── baz
│ │ └── file
│ └── file
├── destdir
└── file
3 directories, 3 files
$ while read a; do mv $a foo/destdir/$(basename $a).$RANDOM; done < <(grep -rl content foo)
$ tree foo
foo
├── bar
│ └── baz
└── destdir
├── file.10171
├── file.10842
└── file.25404
3 directories, 3 files