So führen Sie in diesem Anwendungsfall die Find-Funktion mit grep und cp richtig aus

So führen Sie in diesem Anwendungsfall die Find-Funktion mit grep und cp richtig aus

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 xargsund schauen Sie sich die -IFlagge an.

find . -type f -exec grep -ilR "MY PATTERN" {} \; | xargs -I % cp % /dest/dir/

Außerdem wird nach der Flagge ein „ oder“ finderwartet .\;+-exec

Antwort2

Ich glaube nicht, dass Sie find brauchen. Rekursives grep:

grep -rl "MY PATTERN" .

Antwort3

xargsliest 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 -IOption verwenden, um einen Platzhalter für anzugeben xargs, wie folgt: xargs -I '{}' cp '{}' /dest/dir.

findKümmert sich außerdem um die Rekursion, sodass Sie dies grepnicht 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 -ldoppelte Ergebnisse erzeugt (Dateien mit demselben Namen, aber an verschiedenen Orten), und dass daher findder ' execs-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

verwandte Informationen