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:
-
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 GNUgrep
.) -
--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 vongrep
unterstützt unter GNU/Linux, MacOS und FreeBSD, aber nicht OpenBSD.) -
LINUX/UNIX
weist grep an, nur nach Dateien zu suchen, deren Inhalt den RegexLINUX/UNIX
enthält -
.
Suche im aktuellen Verzeichnis. Sie können es in neueren Versionen von GNUgrep
weglassen , aber dann müssten Sie einen--
übergeben Option Abschlusszeichen zucp
zum Schutz vor Dateinamen, die mit-
beginnen .
-
-
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 mitxargs
von OSX kompatibel .) -
cp -t /path/to/dest
kopiert die Verzeichnisse in das Zielverzeichnis. (-t
erfordert GNUcp
.)
-