Nach meinem Verständnis sollte Folgendes genau dasselbe bedeuten:
ls -1 | xargs file {}
ls -1 | xargs -I{} file {}
Wenn die Option -I nicht angegeben ist, wird standardmäßig -I {} verwendet.
Ich möchte alle Dateien im aktuellen Verzeichnis auflisten und den file
Befehl für jede einzelne ausführen . Einige haben Leerzeichen in ihren Namen. Ich bemerkte jedoch den Unterschied. Siehe unten:
$ ls -1
Hello World
$ ls -1 | xargs file {}
{}: ERROR: cannot open `{}' (No such file or directory)
Hello: ERROR: cannot open `Hello' (No such file or directory)
World: ERROR: cannot open `World' (No such file or directory)
$ ls -1 | xargs -I{} file {}
Hello World: directory
Wenn -I {} explizit angegeben wird, werden Leerzeichen in Dateinamen wie erwartet behandelt.
xargs file
oder angebenxargs -I{} file {}
. Sollte nicht seinxargs file {}
. Ich denke, wenn Sie -I {} explizit angeben, wird die Bash wie folgt behandeltfile "Hello World"
. Ohne -I {} wird es als behandeltfile Hello World
.-1
Option kennenls
, aber sie ist standardmäßig aktiviert, wenn die Ausgabe vonls
eine Datei oder eine Pipe ist, sodass Sie sie hier nicht benötigen. (3) Sie verwechseln-I
mit der veralteten Option-i
(KleinbuchstabenI
).-ifoo
ist gleichbedeutend mit-Ifoo
, aber schlicht-i
ist gleichbedeutend mit-I{}
. Aber benutze-I{}
. (4) Wenn du wirklich tun willst, was du sagst, warum nicht einfach sagenfile *
?file
. Aber ich fand ein einfacheres Beispiel mitls
. Du hast recht. Dafürfile *
ist das beste.-exec
.Antworten:
Das
-I
erfordert einen definierten Platzhalter. Die-i
Option setzt voraus, dass{}
es sich um den Platzhalter handelt. Dies war der Punkt, an dem ichman xargs
zumindest bei Cygwin und CentOS eine Annahme von {} fand .xargs, das ohne eine der beiden Optionen aufgerufen wird, benötigt keinen Platzhalter und hängt die STDIN nur an das Ende der Argumente an.
Ergänzen
echo
Sie einfach Ihre Beispiele, um zu sehen, was xargs tut:In Ihrem Beispiel wird aus Versehen Folgendes verwendet
{}
:so
file
sieht der cmd args von{} Hello World
und fehler.Wenn Sie explizit
{}
in Ihrem xargs-Aufruf verwenden möchten :Oder ohne Platzhalter:
xargs wie oben genannt benötigt das {} nicht. Das STDIN wird ohne Platzhalter an das Ende des Befehls angehängt. Die Verwendung von {} bedeutet normalerweise, dass Sie die STDIN irgendwo in der Mitte des Befehls ausführen möchten, wie in:
quelle