Xargs
Entwickler (en) | Verschiedene Open Source und kommerziell Entwickler |
---|---|
Betriebssystem | Unix, Unix-artig, Ibm i |
Plattform | Plattformübergreifend |
Typ | Befehl |
Xargs (kurz für "erweiterte Argumente" [1]) ist ein Befehl an Unix Und die meisten Unix-artig Betriebssysteme Wird verwendet, um Befehle zu erstellen und auszuführen von Standardeingabe. Es wandelt die Eingaben von Standardeingaben in Argumente in einen Befehl um.
Einige Befehle wie z. Grep
und awk
Kann Eingaben entweder als Befehlszeilenargumente oder aus der Standardeingabe entgegennehmen. Andere jedoch wie CP
und Echo
kann nur Eingaben als Argumente nehmen, weshalb Xargs ist notwendig.
Ein Port einer älteren Version von GNU Xargs ist für Microsoft Windows Im Rahmen des Unxutils Sammlung von einheimisch Win32 Häfen von gemeinsamen GNU-Unix-ähnlichen Versorgungsunternehmen.[2] Ein bundem Umschreiben genannt Wargs ist Teil der Open-Source-Texttools[3] Projekt. Das Xargs Der Befehl wurde auch auf die portiert Ibm i Betriebssystem.[4]
Beispiele
Ein Anwendungsfall der Xargs Der Befehl besteht darin, eine Liste von Dateien mit dem zu entfernen rm Befehl. Posix Systeme haben an Arg_max Für die maximale Gesamtlänge der Befehlszeile,,[5][6] Daher kann der Befehl mit einer Fehlermeldung der "Argumentliste zu lang" fehlschlagen (was bedeutet, dass die Grenze des EXEC -Systems für die Länge einer Befehlszeile überschritten wurde): rm /path/*
oder rm $(find /path -type f)
. (Letzterer Aufruf ist falsch, da es die Globs in der Ausgabe erweitern kann.)
Dies kann mit dem umgeschrieben werden Xargs
Befehl, um die Liste der Argumente in Untermesser zu untertreffen, die klein genug sind, um akzeptabel zu sein:
Finden /Pfad -Typ F -Print | xargs rm
Im obigen Beispiel die finden
Dienstprogramm füttert die Eingabe von Xargs
mit einer langen Liste von Dateinamen. Xargs
Dann spaltet diese Liste in Untervermieter und Anrufe auf rm
Einmal für jeden Sublisten.
Einige Implementierungen von Xargs kann auch verwendet werden, um Operationen mit dem zu parallelisieren -P MaxProcs
Argument zum Angeben, wie viele parallele Prozesse verwendet werden sollten, um die Befehle über die Eingabemargumentlisten auszuführen. Die Ausgangsströme werden jedoch möglicherweise nicht synchronisiert. Dies kann durch die Verwendung eines überwunden werden -Ausgabedatei
Argument, wo möglich, und dann die Ergebnisse nach der Verarbeitung kombinieren. Das folgende Beispiel stellt 24 Prozesse und wartet auf jeden, um zu beenden, bevor sie einen anderen starten.
NAME FIND /PATH -NAME '*.foo' | xargs -p 24 -ICH '{}' /cpu/gebunden/prozess '{}' -Ö '{}'.aus
Xargs deckt oft die gleiche Funktionalität wie die ab wie die Befehlssubstitution Merkmal vieler Muscheln, gekennzeichnet durch die Rückquote Notation (`...`
oder $ (...)
). Xargs ist auch ein guter Begleiter für Befehle, die lange Listen von Dateien wie z. finden
, Lokalisieren
und Grep
, aber nur, wenn man verwendet -0
(oder gleichwertig --Null
), seit Xargs
ohne -0
befasst sich schlecht mit Dateinamen, die enthalten sind '
, "
und Raum. GNU parallel ist ein ähnliches Tool, das eine bessere Kompatibilität mit bietet finden, Lokalisieren und Grep Wenn Dateinamen enthalten sein können '
, "
, und Raum (Newline erfordert immer noch -0
).
Platzierung von Argumenten
-I -Option: Einzelargument
Das Xargs Der Befehl bietet Optionen, um die aufgeführten Argumente an einer anderen Position als am Ende der Befehlszeile einzufügen. Das -ICH
Option zu Xargs Nimmt eine Zeichenfolge, die durch die angegebene Eingabe ersetzt wird, bevor der Befehl ausgeführt wird. Eine gemeinsame Wahl ist %
.
$ mkdir ~/backups$ Finden /Pfad -Typ f -Name '*~' -print0 | xargs -0 -i% cp -a% ~/Backups
Die zu ersetzende Zeichenfolge kann im Befehlsteil mehrmals angezeigt werden. Verwendung -ICH Die Anzahl der Zeilen, die jedes Mal jeweils verwendet werden.
Muscheltrick: irgendeine Nummer
Eine andere Möglichkeit, einen ähnlichen Effekt zu erzielen, besteht darin, eine Shell als Startbefehl zu verwenden und mit der Komplexität in dieser Shell umzugehen, beispielsweise:
$ mkdir ~/backups$ Finden /Pfad -Typ f -Name '*~' -print0 | xargs -0 sh -c 'für Dateiname; CP -a "$ Dateiname" ~/Backups; erledigt' Sch
Das Wort sh
Am Ende der Linie befindet sich für die POSIX Shell sh -c
zu füllen für $0
, der Teil der Positionsparameter "ausführbarer Name" (ARGV). Wenn es nicht vorhanden wäre, würde der Name der ersten übereinstimmten Datei stattdessen zugewiesen $ 0
und die Datei würde nicht kopiert werden ~/Backups
. Man kann auch jedes andere Wort verwenden, um diese leere zu füllen. my-xargs-script
zum Beispiel.
Seit cp
Akzeptiert mehrere Dateien gleichzeitig, man kann auch Folgendes tun:
$ Finden /Pfad -Typ f -Name '*~' -print0 | xargs -0 sh -c 'if [$# -Gt 0]; dann cp -a "$@" ~/backup; fi ' Sch
Dieses Skript läuft cp
Bei allen Dateien, die es angegeben werden, wenn Argumente übergeben werden. Dies ist effizienter, da nur eine Anrufung von cp
wird für jede Anrufung von durchgeführt sh
.
Trennproblem
Viele UNIX-Dienstprogramme sind zeilenorientiert. Diese können mit funktionieren Xargs
Solange die Linien nicht enthalten '
, "
oder ein Raum. Einige der UNIX -Dienstprogramme können nutzen Nul als Rekordtrennzeichen (z. Perl (erfordert -0
und \0
Anstatt von \n
), Lokalisieren
(erfordert die Verwendung -0
), finden
(erfordert die Verwendung -print0
), Grep
(erfordert -Z
oder -Z
), Sortieren
(erfordert die Verwendung -Z
)). Verwendung -0
zum Xargs
befasst sich mit dem Problem, aber viele UNIX -Dienstprogramme können NUL nicht als Trennzeichen verwenden (z. Kopf
, Schwanz
, ls
, Echo
, sed
, tar -v
, Toilette
, die
).
Aber oft vergessen die Leute das und nehmen an Xargs
ist auch linienorientiert, was ist nicht der Fall (pro Standard Xargs
trennt Newlines und Leerzeichen innerhalb von Linien, Substrings mit Lücken müssen ein- oder doppelt zitiert sein).
Das Separatorproblem wird hier dargestellt:
# Machen Sie einige Ziele zum Üben Berühren Sie wichtige Berührung 'nicht wichtig_file' Mkdir -p '12 "Aufzeichnungen ' finden . -name nicht\* | Schwanz -1 | xargs rm finden \! -Name . -Typ d | Schwanz -1 | Xargs rmdir
Das Laufen des oben genannten wird verursachen wichtig_file
zu entfernt werden, aber weder das genannte Verzeichnis entfernen 12 "Aufzeichnungen
Noch die Datei aufgerufen nicht wichtig_file
.
Die richtige Lösung ist die Verwendung des GNU-spezifischen -print0
Option, aber Schwanz
(und andere Werkzeuge) unterstützen keine NUL-terminierten Zeichenfolgen:
# Verwenden Sie dieselben Vorbereitungsbefehle wie oben finden . -name nicht\* -print0 | xargs -0 rm finden \! -Name . -Type d -print0 | xargs -0 rmdir
Bei Verwendung der -print0
Option, Einträge werden durch ein Nullzeichen anstelle eines Line-Endes getrennt. Dies entspricht dem ausführlicheren Befehl:find . -name not\* | tr \\n \\0 | xargs -0 rm
oder kürzer durch Wechseln Xargs
zu (nicht posix) linienorientierter Modus mit dem -d
(Trennzeichen) Option: find . -name not\* | xargs -d '\n' rm
Aber im Allgemeinen benutzen Sie -0
mit -print0
Sollte bevorzugt werden, da Newlines in Dateinamen immer noch ein Problem sind.
GNU parallel
ist eine Alternative zu Xargs
Das ist so konzipiert, dass dieselben Optionen haben, aber leitend orientiert ist. Daher würde die oben erwartete GNU -Parallele stattdessen wie erwartet funktionieren.[7]
Für Unix -Umgebungen wo Xargs
unterstützt die nicht -0
Noch der -d
Option (z. B. Solaris, AIX), der POSIX-Standard gibt an, dass man einfach jeden Charakter zurückleiten kann:find . -name not\* | sed 's/\(.\)/\\\1/g' | xargs rm
.[8] Alternativ kann man es vermeiden, Xargs überhaupt zu verwenden, entweder durch Verwendung von GNU parallel oder die Verwendung der -exec ... +
Funktionalität von find
.
Betrieb auf einer Untergruppe von Argumenten gleichzeitig
Man könnte sich mit Befehlen befassen, die nur eine oder vielleicht zwei Argumente gleichzeitig akzeptieren können. Zum Beispiel die diff
Der Befehl arbeitet auf zwei Dateien gleichzeitig. Das -n
Option zu Xargs
Gibt an, wie viele Argumente gleichzeitig für den angegebenen Befehl geliefert werden. Der Befehl wird wiederholt aufgerufen, bis die gesamte Eingabe erschöpft ist. Beachten Sie, dass bei der letzten Aufruf möglicherweise weniger als die gewünschte Anzahl von Argumenten bei unzureichenden Eingaben erfolgt. Verwenden Xargs
Um die Eingabe in zwei Argumente pro Zeile zu unterteilen:
$ Echo {0..9} | xargs -n 2 0 1 2 3 4 5 6 7 8 9
Neben einer bestimmten Anzahl von Argumenten gleichzeitig kann man auch einen Befehl für jede Eingabezeile mit dem aufrufen -L 1
Möglichkeit. Man kann eine willkürliche Anzahl von Zeilen gleichzeitig verwenden, aber man ist am häufigsten. So könnte man könnte diff
Jeder Git verpflichtet sich gegen seinen Elternteil.[9]
$ Git log -Format=" %H %P" | xargs -l 1 Git diff
Codierungsproblem
Die Argument -Separator -Verarbeitung von Xargs
ist nicht das einzige Problem bei der Verwendung des Xargs
Programm im Standardmodus. Die meisten Unix -Tools, die häufig zum Manipulieren von Dateinamen verwendet werden (zum Beispiel sed
, Grundname
, Sortieren
usw.) sind Textverarbeitungswerkzeuge. Unix -Pfadnamen sind jedoch nicht wirklich Text. Betrachten Sie einen Pfadnamen/AAA/BBB/CCC. Das /AAA -Verzeichnis und sein BBB -Unterverzeichnis können im Allgemeinen von verschiedenen Benutzern mit unterschiedlichen Umgebungen erstellt werden. Das bedeutet, dass diese Benutzer ein anderes Gebietsschema haben könnten, und das bedeutet, dass AAA und BBB nicht einmal unbedingt die gleiche Charakter -Codierung haben müssen. Zum Beispiel könnte AAA in UTF-8 und BBB in Shift JIs sein. Infolgedessen ist ein absoluter Pfadname in einem UNIX -System möglicherweise nicht korrekt verarbeitbar wie Text unter einer einzigen Zeichencodierung. Tools, die auf ihren Eingabetimenxt angewiesen sind, können in solchen Saiten fehlschlagen.
Eine Problemumgehung für dieses Problem besteht darin, solche Tools im C-Gebietsschema auszuführen, das im Wesentlichen die Bytes der Eingabe als IS verarbeitet. Dies ändert jedoch das Verhalten der Tools auf eine Weise, wie der Benutzer möglicherweise nicht erwartet (z. B. einige der Erwartungen des Benutzers an das Verhalten des Fallverbrechens sind möglicherweise nicht erfüllt).
Verweise
- ^ "Die UNIX -Akronymliste: Die vollständige Liste". www.roesler-ac.de. Abgerufen 2020-04-12.
- ^ "Native Win32 -Ports einiger GNU -Dienstprogramme". Unxutils.SourceForge.net.
- ^ "Textverarbeitungstools für Windows".
- ^ IBM. "IBM System I Version 7.2 Programmierung Qshell" (PDF). Abgerufen 2020-09-05.
- ^ "GNU -Kern -Dienstprogramme stellten häufig Fragen". Abgerufen 7. Dezember, 2015.
- ^ "Die maximale Länge der Argumente für einen neuen Prozess". www.in-ulm.de.
- ^ Unterschiede zwischen Xargs und GNU parallel. Gnu.org. Zugriff auf Februar 2012.
- ^ Die einzelne Unix -Spezifikation, Version 4 von Die offene Gruppe - Shell and Utilities Referenz,
- ^ Cosmin Stejerean. "Dinge, die Sie (wahrscheinlich) über Xargs nicht wussten". Abgerufen 7. Dezember, 2015.
Externe Links
- Die einzelne Unix -Spezifikation, Version 4 von Die offene Gruppe : Konstrukt -Argumentationslisten und aufgerufene Dienstprogramme - Shell and Utilities Referenz,
- Linux Xargs Befehlstutorial mit Beispielen
Handbuchseiten
- GNU Finden Sie Hinweis - -
- Freebsd Allgemeine Befehle Handbuch : Konstruktargumentliste (n) und Dienstprogramm ausführen -
- Netbsd Allgemeine Befehle Handbuch : Konstruktargumentliste (n) und Dienstprogramm ausführen -
- OpenBSD Allgemeine Befehle Handbuch : Konstruktargumentliste (n) und Dienstprogramm ausführen -
- Solaris 10 Benutzerbefehle Referenz Handbuch : Konstrukt -Argumentationslisten und aufrufen Utility -