Ich möchte wissen, was der Unterschied zwischen diesem
ls | xargs rm
ls | xargs -i{} rm {}
Beides funktioniert bei mir
Antwort1
xargs rm
rm
wird mit allen Argumenten als Parameter aufgerufen , wobei Leerzeichen entfernt werden.
xargs -i{} rm {}
rm {}
wird für jedes Argument aufgerufen und {}
durch das aktuelle Argument ersetzt.
Wenn Sie 2 Argumente a.txt
und haben b.txt
, xargs rm
wird dies aufgerufen
rm a.txt b.txt
Aber xargs -i{} rm {}
werde anrufen
rm a.txt
rm b.txt
Dies liegt daran, dass -i
eine Option eine Option impliziert -L 1
, was bedeutet, dass der Befehl jedes Mal rm
nur eine Zeile benötigt 1
. Und hier enthält jede Zeile nur 1 Argument.
Überprüfen Sie diesIdeone-Linkum eine bessere Vorstellung davon zu bekommen.
Antwort2
-i
Option (entspricht --replace
) erstellt eine Art Platzhalter, in dem xargs die gerade empfangene Eingabe speichert. In Ihrem zweiten Befehl ist der Platzhalter {}
, er funktioniert wie die -exec
Option find. Sobald dieser definiert ist, ersetzt xargs diesen Platzhalter durch die gesamte Eingabezeile. Wenn Ihnen der Name nicht gefällt {}
, können Sie einen eigenen definieren:
ls | xargs -iPLACEHOLDER echo PLACEHOLDER
In Ihrem Fall führen beide Befehle zum gleichen Ergebnis. In der zweiten Form machen Sie mit der Option lediglich das Standardverhalten explizit -I
.
Antwort3
Mit Klammern wird ein rm
Prozess pro Datei gestartet. Ohne Klammern xargs
werden so viele Dateinamen wie möglich an jeden rm
Befehl übergeben.
Vergleichen
ls | xargs echo
Und
ls | xargs -I {} echo {}