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?

3voto

Charlie Dalsass Punkte 1934

Alternative Lösungen können hilfreich sein...

Sie können auch ein Nullzeichen am Ende Ihrer Zeilen mit Perl hinzufügen und dann die -0 Option in xargs verwenden. Im Gegensatz zu xargs -d '\n' (in der genehmigten Antwort) funktioniert dies überall, einschließlich OS X.

Zum Beispiel würde ich folgendes verwenden, um rekursiv MP3-Dateien aufzulisten (auszuführen, zu verschieben usw.), die Leerzeichen oder andere lustige Zeichen enthalten:

find . | grep \.mp3 | perl -ne 'chop; print "$_\0"' | xargs -0  ls

(Hinweis: Für das Filtern bevorzuge ich die leichter zu merkende "| grep" Syntax gegenüber den "--name" Argumenten von "find".)

3voto

SauloAlessandre Punkte 585

Ich habe kürzlich die folgende Lösung verwendet:

$ find  | sed -e 's/^/"/' -e 's/$/"/' | xargs 

Beispiel: $ ls *.mp3 | sed -e 's/^/"/' -e 's/$/"/' | xargs mplayer

Dadurch werden alle Dateien zugänglich gemacht

2voto

Dick.Guertin Punkte 29

Angesichts des spezifischen Titels dieses Beitrags hier mein Vorschlag:

ls | grep ' ' | tr ' ' '<' | sed 's|<|\\ |g'

Die Idee besteht darin, Leerstellen in ein beliebiges Zeichen, wie '<', umzuwandeln und dieses dann in '\ ', ein Backslash gefolgt von Leerstelle, zu ändern. Anschließend können Sie das in ein beliebiges gewünschtes Kommando leiten, wie zum Beispiel:

ls | grep ' ' | tr ' ' '<' | sed 's|<|\\ |g' | xargs -L1 GetFileInfo

Der Schlüssel hier liegen in den 'tr'- und 'sed'-Befehlen; und Sie können jedes Zeichen außer '<' verwenden, wie zum Beispiel '?' oder sogar ein Tabulator-Zeichen.

0voto

Auf macOS (Monterey/12 und darüber hinaus und ich bin mir nicht sicher, wie weit zurück es geht, vor 10.15/Catalina), wenn Sie Leerzeichen in Dateinamen oder Unterverzeichnissen haben, können Sie Folgendes verwenden:

mdfind  -0 -onlyin . -name .txt | xargs -0 grep stackoverflow |  wc -l

Wie in der Antwort von Jen erwähnt:

Das Dienstprogramm xargs liest Leerzeichen, Tabulatoren, Zeilenumbrüche und Dateiende-delimierte Zeichenfolgen vom Standardinput 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. Laut Handbuch:

 -0      Ändert xargs, um NUL (``\0'')-Zeichen als Trennzeichen zu erwarten,
         anstelle von Leerzeichen und Zeilenumbrüchen. Dies wird erwartet, in Verbindung mit der -print0 Funktion in find(1) verwendet zu werden.

0voto

Curtis Yallop Punkte 5900

ls *mp3 | xargs -I{} mplayer {}

Solange es Ihnen nichts ausmacht, dass mplayer einmal pro Zeile ausgeführt wird.

Es wird einmal pro zeilenbeendete Zeile ausgeführt. Space wird nicht mehr zusätzlich als Trennzeichen verwendet. Ich kann den MacOS/BSD xargs nicht dazu bringen, Space auf andere Weise als Trennzeichen zu verwenden (-L 1 funktioniert nicht).

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