Ich habe eine Sammlung von Dateien (* .zip, * .txt, * .tar.gz, * .doc, ... usw.). Diese Dateien befinden sich in einem Pfad. Ich möchte alle Dateien (* .txt) finden 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 und "grep" filterte die resultierenden Textdateien, indem nur die Textdateien aufgelistet wurden, die 'LINUX / UNIX' enthalten.
Wie kann ich diese endgültigen Dateien (dh die Textdateien, die 'LINUX / UNIX' enthalten) in einen bestimmten Pfad Ihrer Wahl kopieren?
Ich habe versucht mich zu bewerben xargs
find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>
Aber es hat nicht funktioniert
Antworten:
Versuchen:
Da dieser Befehl die NUL-Trennung verwendet, ist er für alle Dateinamen sicher, einschließlich solcher mit schwierigen Namen, die Leerzeichen, Tabulatoren oder sogar Zeilenumbrüche enthalten.
Das oben genannte erfordert GNU
cp
. Versuchen Sie unter MacOS / FreeBSD:Wie es funktioniert:
grep
Optionen und Argumente-r
Weist grep an, die Verzeichnisstruktur rekursiv zu durchsuchen. (Unter FreeBSD-r
folgen Symlinks 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 übereinstimmen*.txt
(einschließlich versteckter Dateien wie.foo.txt
oder.txt
).-l
Weist grep an, nur die Namen der übereinstimmenden Dateien zurückzugeben, nicht die Übereinstimmung selbst.--null
Weist grep an, NUL-Zeichen zu verwenden, um die Dateinamen zu trennen. (--null
Wird unterstütztgrep
unter GNU / Linux , MacOS und FreeBSD aber nicht OpenBSD .)LINUX/UNIX
Weist grep an, nur nach Dateien zu suchen, deren Inhalt den regulären Ausdruck enthältLINUX/UNIX
.
Suche im aktuellen Verzeichnis. Sie können es in neueren Versionen von GNU weglassengrep
, müssen dann aber einen--
Optionsabschluss übergebencp
, um sich vor Dateinamen zu schützen, die mit beginnen-
.xargs
Optionen und Argumente-0
Weist xargs an, NUL-getrennte Eingaben zu erwarten.-r
weist xargs an, den Befehl nur auszuführen, wenn mindestens eine Datei gefunden wurde. (Diese Option wird weder unter BSD noch unter OSX benötigt und ist nicht mit OSX kompatibelxargs
.)cp -t /path/to/dest
kopiert die Verzeichnisse in das Zielverzeichnis. (-t
erfordert GNUcp
.)quelle
cp -t
es nur Linux gibt.--null
Version aktualisiert und eine Version für BSD / OSX hinzugefügt, die nicht verwendet wirdcp -t
.grep
hat nicht--null
.--null
.Portabler (nur POSIX-Funktionen):
quelle
Der folgende sh / Bash One Liner ist eine andere Methode, funktioniert jedoch nur im aktuellen Verzeichnis und wird nicht wiederholt:
Mit der
-l
Option grep wird eine Liste der Dateien gedruckt, die kopiert werden. Sie können sie jedoch verwenden,-q
wenn Sie nichts auf dem Bildschirm sehen möchten.quelle
Ich bin nicht sicher, warum die ursprüngliche Zeichenfolge nicht funktioniert hat. Der folgende Befehl funktioniert bei mir.
find / -name (Dateiname *) | grep '(filename.extention)' | xargs cp -t ./
In meinem Fall ist Dateiname * eine Sammlung von Dateien mit demselben Namen und unterschiedlichen Dateitypen (txt, zip usw.). Ich grep grep, um nur filename.txt herauszufinden und kopiere es in mein Zielverzeichnis (das derzeit ./ ist).
quelle