Wie kann ich sicherstellen, dass Xargs Dateinamen verarbeiten, die Leerzeichen enthalten?
$ ls *mp3 | xargs mplayer
Playing Lemon.
File not found: 'Lemon'
Playing Tree.mp3.
File not found: 'Tree.mp3'
Exiting... (End of file)
Meinem Befehl, fehl, weil die Datei "Lemon Tree.mp3" Leerzeichen enthält und so xargs denkt, dass es zwei Dateien. Kann ich auch machen find + xargs arbeiten mit Dateinamen wie diesem?
InformationsquelleAutor der Frage it_is_a_literature | 2013-05-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
xargs
Befehl nimmt white-space-Zeichen (Tabulatoren, Leerzeichen, neue Zeilen) als Trennzeichen. Sie können eingrenzen, die nur für das neue-Zeile-Zeichen ('\n') mit-d
- option wie folgt:Es funktioniert nur mit GNU-xargs. Für BSD-Systeme, verwenden Sie die
-0
- option wie folgt:Diese Methode ist einfacher und funktioniert mit dem GNU-xargs als gut.
InformationsquelleAutor der Antwort Ray
Den xargs Programm liest Leerzeichen, Tabulator, newline und end-of-file delimited strings von der standard-Eingabe und führt Programm mit den Zeichenfolgen als Argumente verwendet.
Möchten Sie vermeiden Sie die Verwendung von Leerzeichen als Trennzeichen. Dies kann durch ändern der Trennzeichen für xargs. Laut Handbuch:
Wie:
Antwort auf die Frage über das spielen jeder siebte mp3; es ist einfacher zu laufen
InformationsquelleAutor der Antwort Jens
Versuchen
statt
InformationsquelleAutor der Antwort Scott C Wilson
xargs auf MacOS nicht haben, die -d option, so dass diese Lösung verwendet -0 statt.
Bekommen, ls die Ausgabe einer Datei pro Zeile, dann übersetzen Zeilenumbrüche in Nullen und sagen xargs verwenden Sie null als Trennzeichen:
ls -1 *mp3 | tr "\n" "\0" | xargs -0 mplayer
InformationsquelleAutor der Antwort Graeme Pyle
Das half in meinem Fall, löschen Sie verschiedene Dateien mit Leerzeichen. Es sollte auch funktionieren mit mplayer. Den notwendigen trick sind die Zitate. (Getestet auf linux xubuntu 14.04)
InformationsquelleAutor der Antwort Bendel
Dick.Guertin ' s Antwort [1] vorgeschlagen, dass eine entkommen konnte, die Leerzeichen im Dateinamen ist eine wertvolle alternative zu anderen Lösungen, die hier vorgeschlagen werden (wie zum Beispiel mit einem null-Zeichen als Trennzeichen statt Leerzeichen). Aber es könnte einfacher sein - Sie brauchen nicht wirklich einen einzigartigen Charakter. Sie müssen nur sed hinzufügen entgangen Räume direkt:
Darüber hinaus die grep ist nur erforderlich, wenn Sie nur: Dateien mit Leerzeichen im Namen. Mehr allgemein (z.B. bei der Verarbeitung von batch-Dateien, von denen einige Räume, einige nicht), nur überspringen Sie die grep:
Dann, natürlich, wird der Dateiname möglicherweise anderen whitespace als Leerzeichen (z.B. ein Tabulator):
Geht davon aus, dass Sie einen sed unterstützt -r (extended regex) wie GNU sed oder neuere Versionen von bsd-sed - (z.B. FreeBSD, das ursprünglich geschrieben, die option "-E" vor FreeBSD 8 und unterstützt sowohl-als-f & E für Kompatibilität über FreeBSD 11 zumindest). Ansonsten können Sie nutzen eine einfache regex Zeichenklasse Klammer-Ausdruck, und geben Sie manuell die space und tab-Zeichen in der
[]
Trennzeichen.[1] Dies ist die vielleicht besser geeignet als ein Kommentar oder eine Bearbeitung zu, die Antwort, aber im moment habe ich nicht genug Ruf zu kommentieren und können nur empfehlen, bearbeitet. Da letzteres bildet oben (ohne den grep) ändert sich das Verhalten von Dick.Guertin ' s original-Antwort, eine direkte Bearbeitung ist vielleicht nicht angebracht, sowieso.
InformationsquelleAutor der Antwort Juan
ls | grep mp3 | sed -n "7p" | xargs -i mplayer {}
Beachten Sie, dass in dem Befehl oben
xargs
rufenmplayer
neu für jede Datei. Dies kann unerwünschtmplayer
werden, kann aber okay für die anderen Ziele.InformationsquelleAutor der Antwort A-B-B
Es hängt davon ab, (a) wie befestigt man die Zahl 7 als Gegensatz zu, sagen wir, Zitronen, und (b) ob Ihre Dateinamen Zeilenumbrüche enthalten sind (und ob Sie bereit sind, benennen Sie Sie, wenn Sie es tun).
Gibt es viele Möglichkeiten, damit umzugehen, aber einige von Ihnen sind:
Den
read
Schleife funktioniert nicht, wenn Dateinamen Zeilenumbrüche enthalten; die anderen funktionieren einwandfrei, auch mit newlines im Namen (geschweige denn Räume). Für mein Geld, wenn du die Datei-Namen mit einem newline, sollten Sie die Datei ohne Zeilenumbruch. Die Verwendung der Anführungszeichen um den Namen der Datei ist der Schlüssel zu den loops funktioniert.Wenn Sie GNU
find
und GNUxargs
(oder FreeBSD (*BSD?), oder Mac OS X), können Sie auch die-print0
und-0
Optionen, in:Dieser arbeitet unabhängig vom Inhalt der name (der nur zwei Zeichen, die nicht angezeigt, in einer Datei Namen sind slash und NULL, und der Schrägstrich bewirkt, dass keine Probleme in einer Datei-Pfad, also mit NUL-wie der name Trennzeichen deckt alles). Allerdings, wenn Sie benötigen, heraus zu filtern, die ersten 6 Einträge, benötigen Sie ein Programm, verarbeitet die 'Linien', die damit endete, NUL anstatt "newline" ...und ich bin nicht sicher, dass es Sie gibt.
Die erste ist bei weitem die einfachste für den konkreten Fall auf der hand; es kann jedoch nicht verallgemeinern und auf andere Szenarien, die Sie haben noch nicht aufgeführt.
InformationsquelleAutor der Antwort Jonathan Leffler
Ich weiß, ich bin nicht die Beantwortung der
xargs
Frage direkt aber es ist erwähnenswertfind
's-exec
option.Angesichts der folgenden Datei-system:
Dem Befehl suchen können gemacht werden, um zu behandeln, den Raum in Dream Theater und King ' s X. So, zu finden, der Schlagzeuger der jeweiligen band mit grep:
In der
-exec
option{}
steht für den Dateinamen inklusive Pfad. Beachten Sie, dass Sie nicht haben, um es zu entkommen, oder legen Sie Sie in Anführungszeichen.Den Unterschied zwischen
-exec
's terminatoren (+
und\;
) ist, dass+
Gruppen so viele Datei-Namen, dass es auf einer einzigen Befehlszeile. In der Erwägung, dass\;
wird, führen Sie den Befehl für jede Datei name.So,
find bands/-type f -exec grep Drums {} +
Folge:sowie
find bands/-type f -exec grep Drums {} \;
Folge:Im Fall von
grep
dies hat den Nebeneffekt, entweder drucken die mit dem Namen oder nicht.Natürlich
grep
's Optionen-h
und-H
wird gesteuert, ob oder nicht der Dateiname gedruckt wird, unabhängig davon, wiegrep
genannt wird.xargs
xargs
können auch Steuern, wie man Dateien auf der Kommandozeile.xargs
standardmäßig gruppiert alle Argumente in einer Zeile. Um die gleiche Sache zu tun, dass-exec \;
verwendenxargs -l
. Beachten Sie, dass die-t
option weistxargs
zum drucken der Befehl vor der Ausführung.Sehen, dass die
-l
option teilt xargs ausgeführt grep für jeden Dateinamen.Gegenüber der Standardeinstellung (d.h. keine
-l
option):xargs
hat eine bessere Kontrolle darüber, wie viele Dateien können auf der Kommandozeile. Geben Sie die-l
option die maximale Anzahl von Dateien pro Befehl.Sehen, dass
grep
wurde ausgeführt mit zwei Dateinamen, weil der-l2
.InformationsquelleAutor der Antwort shrewmouse
Den konkreten Titel von diesem post, hier ist mein Vorschlag:
Die Idee ist, zu konvertieren, Leerzeichen zu jedem eindeutigen Zeichen wie '<', und ändern Sie dann, dass in '\ ', ein backslash gefolgt von einem Leerzeichen. Sie können dann-Rohr, das in jedem Befehl, den Sie mag, wie z.B.:
Der Schlüssel liegt hier in der 'tr' und 'sed' - Befehle; und Sie kann alle Zeichen außer '<', wie '?' oder auch ein Tabulator-Zeichen.
InformationsquelleAutor der Antwort Dick.Guertin
Auf macOS 10.12.x, wenn du Leerzeichen im Dateinamen oder Verzeichnissen, die Sie verwenden können, die folgenden:
InformationsquelleAutor der Antwort Byron Formwalt
Dies ist eine alte post, aber die alternativen Lösungen können hilfreich sein...
Können Sie auch ein null-Zeichen am Ende deiner Zeilen mit Perl, dann verwenden die option -0 bei xargs. Im Gegensatz zu den xargs -d '\n' (in zugelassenen Antwort) - das funktioniert überall, auch OSX.
Beispielsweise rekursiv Liste (ausführen, verschieben, etc) jpg-Bilder, die Leerzeichen oder andere komische Zeichen, die ich benutzen würde:
find . | grep \.jpg | perl -ne 'chop; print "$_\0"' | xargs -0 ls
(Hinweis: Für die Filterung, ich bevorzuge das einfacher zu merkende "| grep" syntax "finden" - name-Argumente).
InformationsquelleAutor der Antwort Charlie Dalsass