403 Stimmen

Lassen Sie xargs Dateinamen verarbeiten, die Leerzeichen enthalten

$ ls *mp3 | xargs mplayer  

Wiedergabe von Lemon.  
Datei nicht gefunden: 'Lemon'  
Wiedergabe von Tree.mp3.  
Datei nicht gefunden: 'Tree.mp3'  

Beenden... (Dateiende)  

Mein Befehl schlägt fehl, weil die Datei "Lemon Tree.mp3" Leerzeichen enthält und xargs daher denkt, es handele sich um zwei Dateien. Kann ich Find + xargs mit solchen Dateinamen verwenden?

445voto

Ray Punkte 4613

Der Befehl xargs akzeptiert Leerzeichen (Tabs, Leerzeichen, Zeilenumbrüche) als Trennzeichen.

Sie können es nur auf Zeilenumbrüche ('\n') mit der Option -d einschränken, wie folgt:

ls *.mp3 | xargs -d '\n' mplayer

Dies funktioniert nur mit GNU xargs.

Für MacOS:

ls *.mp3 | tr \\n \\0 | xargs -0 mplayer

Der einfachere und praktischere Ansatz (wenn Sie die Dateinamen nicht weiter verarbeiten müssen):

mplayer *.mp3

249voto

Jens Punkte 65511

Das Dienstprogramm xargs liest Leerzeichen, Tabulatoren, Zeilenumbrüche und durch EOF getrennte Zeichenfolgen vom Standardeingang und führt das Dienstprogramm mit den Zeichenfolgen als Argumenten aus.

Sie möchten vermeiden, Leerzeichen als Trennzeichen zu verwenden. Dies kann durch Ändern des Trennzeichens für xargs erreicht werden. Gemäß dem Handbuch:

 -0      Ändert xargs so, dass NUL (``\0'')-Zeichen als Trennzeichen erwartet werden, 
         anstatt Leerzeichen und Zeilenumbrüche. Dies wird voraussichtlich in Verbindung 
         mit der Funktion -print0 in find(1) verwendet.

Wie zum Beispiel:

 find . -name "*.mp3" -print0 | xargs -0 mplayer

Um die Frage nach dem Abspielen des siebten mp3 zu beantworten, ist es einfacher, auszuführen

 mplayer "$(ls *.mp3 | sed -n 7p)"

33voto

Scott C Wilson Punkte 17730

Versuche

find . -name \*.mp3 -print0 | xargs -0 mplayer

statt

ls | grep mp3

26voto

Graeme Pyle Punkte 2152

Xargs unter MacOS hat keine Option -d, daher verwendet diese Lösung stattdessen -0.

Lassen Sie ls eine Datei pro Zeile ausgeben, übersetzen Sie dann Zeilenumbrüche in Nullen und geben Sie xargs an, Nullen als Trennzeichen zu verwenden:

ls -1 *mp3 | tr "\n" "\0" | xargs -0 mplayer

16voto

Juan Punkte 904

Dick.Guertins Antwort [1] schlug vor, dass man die Leerzeichen in einem Dateinamen entkommen könnte, was eine wertvolle Alternative zu anderen hier vorgeschlagenen Lösungen ist (z. B. die Verwendung eines Nullzeichens als Trennzeichen anstelle von Leerzeichen). Aber es könnte einfacher sein - Sie brauchen wirklich kein eindeutiges Zeichen. Sie können einfach sed die maskierten Leerzeichen direkt hinzufügen:

ls | grep ' ' | sed 's| |\\ |g' | xargs ...

Darüber hinaus ist das grep nur notwendig, wenn Sie nur Dateien mit Leerzeichen in den Namen möchten. Allgemeiner (z. B. bei der Verarbeitung einer Gruppe von Dateien, von denen einige Leerzeichen enthalten, andere nicht), überspringen Sie einfach das grep:

ls | sed 's| |\\ |g' | xargs ...

Dann kann der Dateiname natürlich auch anderes Leerzeichen als Leerzeichen enthalten (z. B. ein Tabulatorzeichen):

ls | sed -r 's|[[:blank:]]|\\\1|g' | xargs ...

Dies setzt voraus, dass Sie ein sed haben, das -r (erweiterte Regex) unterstützt, wie z. B. GNU sed oder aktuelle Versionen von bsd sed (z. B. FreeBSD, das die Option "-E" ursprünglich vor FreeBSD 8 buchstabierte und mindestens bis FreeBSD 11 sowohl -r als auch -E für die Kompatibilität unterstützt). Andernfalls können Sie eine reguläre Regex-Zeichenklasse in eckigen Klammern verwenden und die Leerzeichen und Tabulatoren manuell in den [] Grenzen eingeben.

[1] Dies wäre vielleicht eher als Kommentar oder als Bearbeitung dieser Antwort geeignet, aber im Moment habe ich nicht genug Reputation, um zu kommentieren, und kann nur Bearbeitungen vorschlagen. Da die letzten Formen oben (ohne das grep) das Verhalten von Dick.Guertins originaler Antwort ändern, ist eine direkte Bearbeitung vielleicht sowieso nicht angemessen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X