Ich habe eine file
, die eine Liste von Namen enthält. dh:
Long Name One (001)
Long Name Two (201)
Long Name Three (123)
...
mit Leerzeichen und einigen Sonderzeichen. Ich wollte aus diesen Namen Verzeichnisse machen, dh:
cat file | xargs -l1 mkdir
Es macht einzelne Verzeichnisse durch Leerzeichen getrennt, das heißt Long
, Name
, One
, Two
, Three
, statt Long Name One (001)
, Long Name Two (201)
, Long Name Three (123)
.
Wie kann ich das machen?
shell
xargs
whitespace
Majal
quelle
quelle
-d
Option.Wenn Ihre xargs-Implementierungsunterstützungsoption
-0
:POSIXly:
(Beachten Sie, dass die Verwendung von
while
Schleife zum Verarbeiten von Text im Shell-Skript als schlechte Praxis angesehen wird.)quelle
mkdir
pro Verzeichnis aufzurufen, sondernmkdir
mehr als ein Argument annehmen kann.xargs
erwartet ein ganz besonderes Eingabeformat, bei dem Argumente durch Leerzeichen oder Zeilenumbrüche begrenzt werden (manchmal andere Formen vertikaler Leerzeichen, manchmal abhängig vom aktuellen Gebietsschema) und bei denen einfache Anführungszeichen, doppelte Anführungszeichen und Backslash verwendet werden können, um sie zu umgehen (jedoch in einem anderen Weg von Shell-Anführungszeichen).-l1
besteht nicht darin, eine Eingabezeile als ein einziges Argument an zu übergebenmkdir
, sondern einenmkdir
Aufruf für jede einzelne Eingabezeile aufzurufen , wobei jedoch Wörter in dieser Zeile immer noch als unterschiedliche Argumente getrennt sindmkdir
.Die GNU-Implementierung hat vor Jahrzehnten
xargs
eine-0
Option hinzugefügt , um NUL-begrenzte Eingaben zu akzeptieren. Dies ist der naheliegendste Weg, um Wörter zu trennen, die letztendlich Argumente für einen Befehl sein werden, da das NUL-Zeichen zufällig das einzige Zeichen ist, das in einem Befehlsargument oder Dateinamen nicht vorkommen kann (das von Ihnen gewählte Listenformat, in das eine Datei pro Zeile eingefügt wird kann nicht alle möglichen Dateinamen darstellen, da kein Zeilenumbruch in einem Dateinamen zulässig ist.Das
-0
wurde von mehreren anderenxargs
Implementierungen kopiert , aber nicht von allen.Mit denen können Sie tun:
Das wird
mkdir
so wenig wie möglich mit so vielen Argumenten wie möglich aufgerufen .Beachten Sie jedoch, dass wenn
file
es leer ist,mkdir
es weiterhin ausgeführt wird und Siemkdir
aufgrund des fehlenden Arguments einen Syntaxfehler erhalten . GNUxargs
hat eine-r
Option für die hinzugefügt , die von einigen anderen Implementierungen kopiert wurde.GNU
xargs
fügte (später) auch eine-d
Option hinzu , um beliebige Trennzeichen angeben zu können, aber ich glaube, keine andere Implementierung hat sie kopiert. Mit GNUxargs
ist der beste Weg mit:Wenn Sie die Datei mit
-a
(auch einer GNU-Erweiterung) anstelle von stdin übergeben,mkdir
bleibt das stdin erhalten.POSIXly müssten Sie die Eingabe nachbearbeiten, um sie in das von erwartete Format zu bringen
xargs
. Sie könnten es zum Beispiel tun mit:Wo wir jede Zeile in doppelte Anführungszeichen setzen und jede
"
wie"\""
vor dem Füttern an xargs maskieren.Beachten Sie jedoch mögliche Einschränkungen:
sed
) kann dies fehlschlagen, wenn der Inhalt vonfile
im aktuellen Gebietsschema kein gültiger Text ist. Wennfile
Dateinamen enthalten, die in mehr als einem anderen Zeichensatz oder einem anderen Zeichensatz als dem des Gebietsschemas codiert sind, können Sie das Gebietsschema auf C festlegen, was hilfreich sein sollte.xargs
Implementierungen haben lächerlich niedrige Grenzen für die maximale Länge eines Arguments (kann bis zu 255 Byte betragen).Um den Syntaxfehler bei einem leeren Eingabefehler zu umgehen, können Sie Folgendes schreiben:
quelle
Machen Sie die Namen nullterminiert und teilen Sie sie dort auf:
tr
ersetzt die neue Zeile, durch diecat
ausgegeben wird\0
, und die-0
Flags in weisenxargs
sie an, Argumente auf dem zu teilen\0
.quelle
Sie können dies POSIXLY mit der
-I
Option tun :http://pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html
quelle