GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Grep Word in einer Datei und dann die Datei kopieren?

Ich habe eine Sammlung von Dateien ( *.zip, *.txt, *.tar.gz, *.doc, …etc ). Diese Dateien befinden sich in einem Pfad. Ich möchte alle Dateien finden ( *.txt) und dann nur die Textdateien kopieren, die bestimmte Wörter enthalten (z. B. LINUX/UNIX).

Ich habe Folgendes ausgeführt:

find . -name "*.txt" | grep 'LINUX/UNIX'

Dieser Befehl konnte alle Textdateien finden, dann filterte „grep“ die resultierenden Textdateien, indem nur die Textdateien aufgelistet wurden, die „LINUX/UNIX“ enthalten.

Wie kann ich diese endgültigen Dateien (d. h. die Textdateien, die „LINUX/UNIX“ enthalten) in einen bestimmten Pfad meiner Wahl kopieren?

Ich habe versucht, xargs anzuwenden

find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>

Aber es hat nicht funktioniert

Akzeptierte Antwort:

Versuchen Sie:

grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0r cp -t /path/to/dest

Da dieser Befehl die NUL-Trennung verwendet, ist er sicher für alle Dateinamen, einschließlich solcher mit schwierigen Namen, die Leerzeichen, Tabulatoren oder sogar Zeilenumbrüche enthalten.

Obiges erfordert GNU cp . Versuchen Sie für MacOS/FreeBSD:

grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0 sh -c 'cp "[email protected]" /path/to/dest' sh

Wie es funktioniert:

  1. grep Optionen und Argumente

    • -r weist grep an, die Verzeichnisstruktur rekursiv zu durchsuchen. (Unter FreeBSD, -r folgt symbolischen Links in Verzeichnisse. Dies gilt weder für OS/X noch für neuere Versionen von GNU grep .)

    • --include '*.txt' weist grep an, nur Dateien zurückzugeben, deren Namen mit dem Glob *.txt übereinstimmen (einschließlich versteckter wie .foo.txt oder .txt ).

    • -l weist grep an, nur die Namen übereinstimmender Dateien zurückzugeben, nicht die Übereinstimmung selbst.

    • --null weist grep an, NUL-Zeichen zu verwenden, um die Dateinamen zu trennen. (--null wird von grep unterstützt unter GNU/Linux, MacOS und FreeBSD, aber nicht OpenBSD.)

    • LINUX/UNIX weist grep an, nur nach Dateien zu suchen, deren Inhalt den Regex LINUX/UNIX enthält

    • . Suche im aktuellen Verzeichnis. Sie können es in neueren Versionen von GNU grep weglassen , aber dann müssten Sie einen -- übergeben Option Abschlusszeichen zu cp zum Schutz vor Dateinamen, die mit - beginnen .

  2. xargs Optionen und Argumente

    • -0 weist xargs an, NUL-getrennte Eingaben zu erwarten.

    • -r weist xargs an, den Befehl nicht auszuführen, es sei denn, es wurde mindestens eine Datei gefunden. (Diese Option wird weder auf BSD noch auf OSX benötigt und ist nicht mit xargs von OSX kompatibel .)

    • cp -t /path/to/dest kopiert die Verzeichnisse in das Zielverzeichnis. (-t erfordert GNU cp .)


Linux
  1. Kopieren Sie Dateien im Linux-Terminal

  2. Verschieben Sie Dateien im Linux-Terminal

  3. Wie hebt man ein Wort in der Ausgabe von „Katze“ hervor?

  4. Grep für mehrere Zeichenfolgen in Dateien und dann die Dateien in der Reihenfolge ihrer Größe auflisten?

  5. Pipe zu mehreren Dateien in der Shell?

So kopieren Sie Dateien und Verzeichnisse unter Linux

Cp-Befehl in Linux (Dateien kopieren)

Die 6 besten Möglichkeiten zum Anzeigen von Dateien unter Linux

So kopieren Sie Dateien mit einer bestimmten Dateierweiterung rekursiv

So kopieren Sie Dateien und Verzeichnisse im Linux-Terminal

Sicheres Kopieren von Dateien mit dem SCP-Befehl