Was ist der Unterschied zwischen Xargs mit und ohne Klammern in Linux?

Was ist der Unterschied zwischen Xargs mit und ohne Klammern in Linux?

Ich möchte wissen, was der Unterschied zwischen diesem

ls | xargs rm
ls | xargs -i{} rm {}

Beides funktioniert bei mir

Antwort1

xargs rmrmwird 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.txtund 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 -ieine Option eine Option impliziert -L 1, was bedeutet, dass der Befehl jedes Mal rmnur 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

-iOption (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 -execOption 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 rmProzess pro Datei gestartet. Ohne Klammern xargswerden so viele Dateinamen wie möglich an jeden rmBefehl übergeben.

Vergleichen

ls | xargs echo

Und

ls | xargs -I {} echo {}

verwandte Informationen