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.
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
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:
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:
Das extra -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: Alle Argumente werden korrekt zitiert. Beachten Sie, dass dies fehlschlägt, wenn irgendwelche Dateinamen Zeilenumbrüche enthalten, und dass "
am Ende ist da, weil die sh
"ls -v
man-Seite
ls | sort -n
im Grunde %code% ist.
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!
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:
Verwenden Sie -i
Option:
Ausgabe:
%Vor%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!
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%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: Alle Argumente werden korrekt zitiert. Beachten Sie, dass dies fehlschlägt, wenn irgendwelche Dateinamen Zeilenumbrüche enthalten, und dass %code% im Grunde %code% ist.
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.
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.
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%