Befehl: xargs -n 1 basename|sed -e ....

  • Themenstarter Themenstarter Revenant
  • Beginndatum Beginndatum
R

Revenant

Guest
Hi,

ich lese gerade einen Wiki Artikel von ubuntuusers.de. Dort wird das Kommando:

ls /var/lib/dpkg/info/*.templates|xargs -n 1 basename|sed -e "s/.templates$//"

benutzt um irgendwelche konfiguierbaren Pakete (was immer ein konfiguierbares Paket auch ist...) anzuzeigen. Mein Problem liegt in dem Verständnis des Befehls.

Klar, ls zeigt alle dateien mit der Endung .templates in dem entsprechenden Verzeichnis an. Diese Ausgabe wird dann an xargs weitergeleitet.

1. Jetzt stell ich mir die Frage warum hier das -n 1 benutzt wird. Es dürfte doch keine Rolle spielen wie oft xargs aufgerufen wird.

2. Wenn ich das -n 1 weglasse, beschwert sich basename und ich verstehe nicht warum
basename: zusätzlicher Operand ?/var/lib/dpkg/info/ca-certificates.templates?
?basename --help? gibt weitere Informationen.

3. sed hab ich auch noch nie gesehn. Mein Gott, wer kann sich überhaupt sowas merken!?! ?( 8o


Thx
 
Also so wie ich das verstehe, gibt das "xargs -n 1 befehl" an den befehl immer nur ein argument.

sed -e s/irgendwas/irgendwasanderes/ ersetzt in einem text irgendwas durch irgendwasanderes

der ganze befehl dürfte dir wohl einfach von /var/lib/dpkg/info alle datein anzeigen, die auf .templates enden und gibt sie dir dann ohne endung .templates aus.

korrigiert mich wenn ich falsch liege, habs nicht getestet, sondern nur nach meinen shell-kenntnissen geschrieben
 
Der Sinn in der Verwendung von xargs -n 1 basename liegt darin, aus jeder einzelnen Datei den Pfad zu entfernen. Beispielsweise könnte ls folgendes ausgeben (hier template in postrm geändert, damit das Beispiel bei mir funktioniert):

Code:
/var/lib/dpkg/info/acpid.postrm
/var/lib/dpkg/info/adduser.postrm
/var/lib/dpkg/info/alsa-base.postrm
/var/lib/dpkg/info/alsa-oss.postrm
/var/lib/dpkg/info/alsa-utils.postrm
/var/lib/dpkg/info/antiword.postrm
/var/lib/dpkg/info/apache2.2-common.postrm
/var/lib/dpkg/info/apache-common.postrm
/var/lib/dpkg/info/apache.postrm
/var/lib/dpkg/info/aptitude.postrm
/var/lib/dpkg/info/apt.postrm
/var/lib/dpkg/info/apt-utils.postrm

Ich kann basename (entfernen des Pfades) jedoch nur für einen String ausführen. basename /var/lib/dpkg/info/*.postrm würde also nicht gehen. Deshalb wird die Ausgabe von ls an xargs gepiped, welches dann für jede empfangene Zeile einen einzelnes basename ausführt. In einigen Shells (wie z.B. des ZSH) lässt sich das ganze auch so machen:

Code:
foreach i in /var/lib/dpkg/info/*.template
  basename $i
end

Der Unterschied liegt nur darin, dass xargs (fast) beliebig viele Daten verarbeiten kann, ZSH oder andere nicht.

Zu sed beachte folgendes Beispiel:

Code:
PHOBOS-DUA0 $ basename /var/lib/dpkg/info/acpid.postrm
acpid.postrm
PHOBOS-DUA0 $ echo "acpid.postrm" | sed -e "s/.postrm$//"   
acpid
PHOBOS-DUA0 $ echo "acpid.postrm" | sed -e "s/.postrm$/blablabla/"
acpidblablabla
PHOBOS-DUA0 $ _
 
okay alles klar, vielen Dank für die wirklich ausführlichen Antworten
 
Zurück
Oben