Wie kann ich mit xargs Dateien kopieren, deren Namen Leerzeichen und Anführungszeichen enthalten?
Ich versuche, kopieren Sie eine Reihe von Dateien unter einem Verzeichnis eine Reihe von Dateien mit Leerzeichen und einfache Anführungszeichen in Ihrem Namen. Wenn ich versuche zu string zusammen find
und grep
mit xargs
bekomme ich die folgende Fehlermeldung:
find .|grep "FooBar"|xargs -I{} cp "{}" ~/foo/bar
xargs: unterminated quote
Irgendwelche Vorschläge für eine stabilere Verwendung von xargs?
Dies ist auf MacOS 10.5.3 mit BSD xargs
.
InformationsquelleAutor der Frage Drew Stephens | 2008-09-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kombinieren Sie all das in einem einzigen
find
Befehl:Dieser Griff Dateinamen und Verzeichnisse mit Leerzeichen in Ihnen. Sie können
-name
zu bekommen groß-und Kleinschreibung Ergebnisse.Hinweis: Die
--
flag übergebencp
verhindert, dass es bei der Verarbeitung von Dateien, beginnend mit-
als Optionen.InformationsquelleAutor der Antwort godbyk
find . -print0 | grep --null 'FooBar' | xargs -0 ...
Weiß ich nicht, ob
grep
unterstützt--null
noch, obxargs
unterstützt-0
auf Leopard, aber unter GNU es ist alles gut.InformationsquelleAutor der Antwort Chris Jester-Young
Dies ist effizienter, als es nicht laufen "cp" mehrfach:
InformationsquelleAutor der Antwort Tometzky
Der einfachste Weg, das zu tun, was das ursprüngliche Plakat will ist, ändern Sie das Trennzeichen aus alle whitespace-Zeichen nur auf die end-of-line-Zeichen wie diese:
InformationsquelleAutor der Antwort user87601
Ich lief in das gleiche problem. Hier ist, wie ich es gelöst:
Ich verwendet
sed
zu ersetzen jede Zeile mit der gleichen Zeile, aber umgeben von doppelten Anführungszeichen. Aus dersed
Mann-Seite, "...Ein kaufmännisches und-Zeichen (`&"), die in der Ersatz ist ersetzt durch den string passend zu den RE..." -- in diesem Fall.*
wird die gesamte Zeile.Löst dies das
xargs: unterminated quote
Fehler.InformationsquelleAutor der Antwort oyouareatubeo
Diese Methode funktioniert auf Mac OSx Lion 10.7.5
Edit: Auch gerade getestet die genaue syntax, die Sie geschrieben. Dass das auch geklappt, auf 10.7.5.
InformationsquelleAutor der Antwort the_minted
Hier ist ein portables (POSIX) - Lösung, d.h. eine, die nicht erfordern
find
xargs
odercp
GNU-spezifische Erweiterungen:Wird es richtig handhaben von Dateien und Verzeichnissen mit Leerzeichen, Zeilenumbrüche oder was auch immer, und ist effizienter (d.h. schneller) als die akzeptierten und die meisten, wenn nicht alle anderen Antworten.
InformationsquelleAutor der Antwort jlliagre
Blick in die --null-commandline-option für xargs mit -print0-option in der zu finden.
InformationsquelleAutor der Antwort Shannon Nelson
Für diejenigen, die stützt sich auf Befehle, andere als finden, z.B.
ls
:InformationsquelleAutor der Antwort Aleksandr Guidrevitch
Habe ich herausgefunden, dass folgende syntax funktioniert gut für mich.
In diesem Beispiel, ich bin auf der Suche nach den größten 200 Dateien über 1.000.000 bytes, die in das filesystem gemountet unter "/usr/pcapps".
Perl-line-liner zwischen "finden" und "xargs" entweicht/quotes jeden Rohling so "xargs" geht irgendwelche Dateinamen mit Leerzeichen zu "ls" als ein einziges argument.
Bill Starr
Fri, 23 Jan 2009, 5:40 pm EST
InformationsquelleAutor der Antwort
Ich glaube, dass diese Arbeit zuverlässig für ein beliebiges Zeichen außer Zeilenvorschub (und ich vermute, dass, wenn Sie haben die line-feeds in Ihren Dateinamen, dann hast du schlimmere Probleme als diese). Es erfordert keine GNU findutils, nur Perl -, so ist es sollte ziemlich viel überall.
InformationsquelleAutor der Antwort mavit