Wie kann ich alle Argumente mit Xargs in der Mitte des Befehls in Linux übergeben

9

Ich möchte alle Dateien als einzelnes Argument unter Linux übergeben, aber das kann ich nicht.

Das funktioniert

%Vor%

Dies übergibt ein einzelnes Argument pro Befehl, aber ich möchte alles in einem Befehl.

    
user2027303 01.02.2013, 03:23
quelle

6 Antworten

14

Dies ist eine Möglichkeit, dies zu tun

%Vor%

oder mit Backtick

%Vor%

Wie in den Kommentaren erwähnt, funktioniert das nicht bei Dateinamen, die Leerzeichen enthalten. In diesem Fall könnten Sie eval

verwenden %Vor%

Angenommen, es gibt zwei Dateien mit den Namen "0 foo" und "1 bar", dann wäre das Ergebnis von eval der gewünschte Befehl mit den Dateinamen in Anführungszeichen:

%Vor%

Wenn die Dateinamen Zeilenumbrüche enthalten können, verwenden Sie den Befehl find , siehe Diskussion von @joeytwiddle in den Kommentaren von @ andrewdotns Antwort. Die folgende Lösung behandelt auch Dateinamen mit doppelten Anführungszeichen, indem sie den Befehl sed verwendet, um doppelte Anführungszeichen zu umgehen:

%Vor%     
amdn 01.02.2013, 04:23
quelle
9

Es ist hässlich, aber Sie können sh -c ausführen und auf die Liste der Argumente zugreifen, die von xargs als "${@}" übergeben wurden, etwa so:

%Vor%

Das extra "sh" am Ende ist da, weil die ls -v man-Seite

  

-c Zeichenfolge

     

Wenn die Option -c vorhanden ist, werden Befehle von string gelesen. Wenn nach der Zeichenfolge Argumente vorhanden sind, werden sie den Positionsparametern zugewiesen, beginnend mit $ 0 .

Um dies zu testen, erstellen wir zuerst einige Dateien mit komplizierten Namen, die die meisten anderen Lösungen durcheinander bringen:

%Vor%

Alle Argumente werden korrekt zitiert. Beachten Sie, dass dies fehlschlägt, wenn irgendwelche Dateinamen Zeilenumbrüche enthalten, und dass ls | sort -n im Grunde %code% ist.

    
andrewdotn 01.02.2013 04:54
quelle
9

Verwenden Sie -I Option:

%Vor%

Ausgabe:

%Vor%     
Hongbo Liu 01.11.2016 06:42
quelle
2

Dies sollte mit Dateinamen funktionieren, die Leerzeichen, Zeilenumbrüche, Apostrophe und Anführungszeichen enthalten (die alle in UNIX-Dateisystemen möglich sind):

%Vor%

Das könnte im Vergleich zur akzeptierten Antwort zu viel werden, wenn Sie wissen, dass Sie mit einfachen Dateinamen arbeiten.

Aber wenn Sie ein Skript schreiben, das in Zukunft wieder verwendet wird, ist es wünschenswert, dass es nicht eines Tages explodiert, wenn es ungewöhnliche (aber gültige) Eingaben trifft.

Dies ist im Grunde eine Anpassung der Antwort von andrewdotn , die Eingabedateien mit einem Nullbyte beendet, anstatt mit ein Newline, daher Dateinamen beibehalten, die ein oder mehrere Zeilenumbruchzeichen enthalten.

Die jeweiligen Optionen -print0 , -z und -0 sagen jedem der Programme, dass Eingabe / Ausgabe durch das Null-Byte begrenzt werden soll. Drei verschiedene Programme, drei verschiedene Argumente!

    
joeytwiddle 24.02.2016 20:14
quelle
1

Sie können dies tun, indem Sie zwei Aufrufe an xargs verketten. Verwenden Sie die erste, um alle Args zu einer Zeichenkette zusammenzufassen und diese als Parameter an echo zu übergeben, und die zweite mit -I , um diese Argskette an die gewünschte Stelle zu setzen, wie folgt:

%Vor%     
JakeRobb 20.03.2018 16:11
quelle
0
___ qstnhdr ___ Wie kann ich alle Argumente mit Xargs in der Mitte des Befehls in Linux übergeben ___ answer40355248 ___

Verwenden Sie -i Option:

%Vor%

Ausgabe:

%Vor%     
___ answer35612138 ___

Dies sollte mit Dateinamen funktionieren, die Leerzeichen, Zeilenumbrüche, Apostrophe und Anführungszeichen enthalten (die alle in UNIX-Dateisystemen möglich sind):

%Vor%

Das könnte im Vergleich zur akzeptierten Antwort zu viel werden, wenn Sie wissen, dass Sie mit einfachen Dateinamen arbeiten.

Aber wenn Sie ein Skript schreiben, das in Zukunft wieder verwendet wird, ist es wünschenswert, dass es nicht eines Tages explodiert, wenn es ungewöhnliche (aber gültige) Eingaben trifft.

Dies ist im Grunde eine Anpassung der Antwort von andrewdotn , die Eingabedateien mit einem Nullbyte beendet, anstatt mit ein Newline, daher Dateinamen beibehalten, die ein oder mehrere Zeilenumbruchzeichen enthalten.

Die jeweiligen Optionen {} , %code% und %code% sagen jedem der Programme, dass Eingabe / Ausgabe durch das Null-Byte begrenzt werden soll. Drei verschiedene Programme, drei verschiedene Argumente!

    
___ answer49389119 ___

Sie können dies tun, indem Sie zwei Aufrufe an xargs verketten. Verwenden Sie die erste, um alle Args zu einer Zeichenkette zusammenzufassen und diese als Parameter an %code% zu übergeben, und die zweite mit %code% , um diese Argskette an die gewünschte Stelle zu setzen, wie folgt:

%Vor%     
___ answer14639966 ___

Es ist hässlich, aber Sie können %code% ausführen und auf die Liste der Argumente zugreifen, die von %code% als %code% übergeben wurden, etwa so:

%Vor%

Das extra %code% am Ende ist da, weil die %code% man-Seite

  

-c Zeichenfolge

     

Wenn die Option -c vorhanden ist, werden Befehle von string gelesen. Wenn nach der Zeichenfolge Argumente vorhanden sind, werden sie den Positionsparametern zugewiesen, beginnend mit $ 0 .

Um dies zu testen, erstellen wir zuerst einige Dateien mit komplizierten Namen, die die meisten anderen Lösungen durcheinander bringen:

%Vor%

Alle Argumente werden korrekt zitiert. Beachten Sie, dass dies fehlschlägt, wenn irgendwelche Dateinamen Zeilenumbrüche enthalten, und dass %code% im Grunde %code% ist.

    
___ qstntxt ___

Ich möchte alle Dateien als einzelnes Argument unter Linux übergeben, aber das kann ich nicht.

Das funktioniert

%Vor%

Dies übergibt ein einzelnes Argument pro Befehl, aber ich möchte alles in einem Befehl.

    
___ tag123linux ___ LINUX FRAGEN MÜSSEN PROGRAMMIEREN VERWANDT SEIN. Verwenden Sie dieses Tag nur, wenn sich Ihre Frage auf das Programmieren mit Linux-APIs oder das Linux-spezifische Verhalten bezieht, nicht nur, weil Sie Ihren Code unter Linux ausführen. Wenn Sie Linux-Unterstützung benötigen, können Sie https://unix.stackexchange.com oder https://askubuntu.com ausprobieren ___ answer35612533 ​​___

Das Problem hierbei ist, dass, während xargs einzelne Argumente in die Mitte des Befehls mit %code% und %code% setzen kann, dies für mehrere Argumente ablehnt. Dies scheint ein Versehen zu sein, das uns viele Probleme bereitet!

Abgesehen von den oben genannten Lösungen besteht eine weitere Alternative darin, die Argumente, die nach den Dateien eingefügt werden sollen, einfach an das Ende der Liste der Dateien anzuhängen.

%Vor%

Dieser Ansatz funktioniert nicht für Dateinamen, die Zeilenumbrüche enthalten . Für diesen seltenen Fall sollten Sie Zeilen, die mit einem Nullbyte abgeschlossen sind, an xargs übergeben, wie in meiner anderen Antwort angeboten.

    
___ tag123xargs ___ xargs ist ein Befehl unter Unix und den meisten Unix-ähnlichen Betriebssystemen zum Erstellen und Ausführen von Befehlszeilen aus der Standardeingabe. ___ answer14639684 ___

Dies ist eine Möglichkeit, dies zu tun

%Vor%

oder mit Backtick

%Vor%

Wie in den Kommentaren erwähnt, funktioniert das nicht bei Dateinamen, die Leerzeichen enthalten. In diesem Fall könnten Sie %code%

verwenden %Vor%

Angenommen, es gibt zwei Dateien mit den Namen "0 foo" und "1 bar", dann wäre das Ergebnis von eval der gewünschte Befehl mit den Dateinamen in Anführungszeichen:

%Vor%

Wenn die Dateinamen Zeilenumbrüche enthalten können, verwenden Sie den Befehl %code% , siehe Diskussion von @joeytwiddle in den Kommentaren von @ andrewdotns Antwort. Die folgende Lösung behandelt auch Dateinamen mit doppelten Anführungszeichen, indem sie den Befehl %code% verwendet, um doppelte Anführungszeichen zu umgehen:

%Vor%     
___
joeytwiddle 24.02.2016 20:34
quelle

Tags und Links