Betrachten Sie diesen Befehl:
ls /mydir/*.txt | xargs chown root
Es ist beabsichtigt, die Eigentümer aller Textdateien in mydir
root zu ändern
Das Problem ist, dass wenn xargs keine .txt
Dateien enthält, mydir
xargs einen Fehler ausgibt, der besagt, dass kein Pfad angegeben ist. Dies ist ein harmloses Beispiel, da ein Fehler ausgegeben wird, aber in einigen Fällen, wie in dem Skript, das ich hier verwenden muss, wird angenommen, dass ein leerer Pfad das aktuelle Verzeichnis ist. Wenn ich diesen Befehl /home/tom/
dann ausführe, wenn es kein Ergebnis für gibt ls /mydir/*.txt
und alle Dateien unter /home/tom/
ihren Besitzern in root geändert wurden.
Wie kann ich xargs ein leeres Ergebnis ignorieren lassen?
ls
für den programmatischen Gebrauch leiten. siehe mywiki.wooledge.org/ParsingLsgit branch --merged | grep -v '^* ' | xargs git branch -d
, dass auch bei leerer Eingabe fehlschlägtAntworten:
Für GNU
xargs
können Sie die Option-r
oder verwenden--no-run-if-empty
:quelle
brew install findutils
.findutils
nichtfileutils
.Benutzer von nicht-GNU xargs nehmen können Vorteil
-L <#lines>
,-n <#args>
,-i
, und-I <string>
:Beachten Sie, dass xargs die Zeile in Leerzeichen aufteilt, aber Anführungszeichen und Escapezeichen verfügbar sind. RTFM für Details.
Wie Doron Behar erwähnt, ist diese Problemumgehung nicht portierbar, sodass möglicherweise Überprüfungen erforderlich sind:
quelle
xargs
den--no-run-if-empty
Switch nicht unterstützt und versucht, das Befehlsargument ohne STDIN-Eingabe auszuführen (dies ist in Solaris 10 der Fall). Die Versionen in anderen Unixen ignorieren möglicherweise nur eine leere Liste (z. B. AIX).echo '' | xargs -n1 echo blah
wird nichts ausgeführt. währendecho 'x' | xargs -n1 echo blah
druckt "bla".ls /mydir/*.txt | xargs -n 1 -I {} chown root {}
, wie diese Antwort nahelegt.echo '' | xargs -n1 echo blah
gedrucktblah
wirdxargs
.man xargs
sagt--no-run-if-empty
.quelle
In Bezug auf
xargs
können Sie-r
wie vorgeschlagen verwenden, es wird jedoch von BSD nicht unterstütztxargs
.Um dieses Problem zu umgehen, können Sie eine zusätzliche temporäre Datei übergeben, zum Beispiel:
oder leiten Sie seinen stderr in null (
2> /dev/null
) um, zEin weiterer besserer Ansatz besteht darin, gefundene Dateien mit der
while
Schleife zu durchlaufen :Siehe auch: Ignorieren Sie leere Ergebnisse für xargs in Mac OS X.
Beachten Sie außerdem, dass Ihre Methode zum Ändern der Berechtigungen nicht besonders gut ist und nicht empfohlen wird. Auf jeden Fall sollten Sie nicht Parse - Ausgabe des
ls
Befehls (siehe: Warum sollte man nicht die Ausgabe von ls parsen ). Insbesondere wenn Sie Ihren Befehl über root ausführen, da Ihre Dateien Sonderzeichen enthalten können, die von der Shell interpretiert werden können, oder wenn Sie sich vorstellen, dass die Datei ein Leerzeichen enthält/
, können die Ergebnisse schrecklich sein.Daher sollten Sie Ihren Ansatz ändern und
find
stattdessen den Befehl verwenden, zquelle
while IFS= read -r -d '' file
gültig ist. Können Sie erklären?Unter OSX: Bash-Neuimplementierung des
xargs
Umgangs mit dem-r
Argument, setzen Sie das zB ein$HOME/bin
und fügen Sie es hinzu zuPATH
:quelle
Dies ist ein Verhalten von GNU-xargs, das mit -r, --no-run-if-empty unterdrückt werden kann.
Die * BSD-Variante von xargs hat dieses Verhalten standardmäßig, daher wird -r nicht benötigt. Seit FreeBSD 7.1 (veröffentlicht im Januar 2009) wird aus Kompatibilitätsgründen ein -r-Argument akzeptiert (was nichts tut).
Ich persönlich bevorzuge die Verwendung von Longopts in Skripten, aber da * BSD xargs keine Longopts verwendet, verwenden Sie einfach "-r" und xargs verhält sich auf * BSD und Linux-Systemen genauso
xargs unter MacOS (derzeit MacOS Mojave) unterstützt das Argument "-r" leider nicht.
quelle