Der Fehler wurde generiert, weil Sie viele verwenden '
. Insbesondere s/$/\/version/
liegt außerhalb eines einzelnen Zitats.
sed
arbeitet entweder an einer Datei oder an der Standardeingabe. Eine als Parameter übergebene Zeichenfolge kann nicht geändert werden. printf
eingebauter Befehl kann zum Anhängen verwendet werden /version
.
Bemerkungen:
- Für jede aus der
tmp1
Datei gelesene Zeile wird ein Name extrahiert, daher enthalten die Namen nicht\n
. - Je nach Verwendung von
cut
und enthaltentr
die resultierenden Verzeichnisse.
weder;
char noch in ihren Namen.
Was Sie zu erreichen versuchen, ist folgendes:
cut -d ';' -f 1 tmp1 | tr '.' '/' | xargs -I % bash -c 'mkdir -p "%" ; printf "%s/version/\n" "%"' > output
Beachten Sie, dass spezielle Zeichen in Namen die obige Befehlszeile aufheben: zB '
(einfaches Anführungszeichen).
cut
und tr
kann nur durch einen ersetzt werden, mit awk
dem xargs -0
die Namen sicher behandelt werden können (durch null Zeichen getrennt).
Probieren Sie diese sichere Version aus:
awk -F\; '' tmp1 | xargs -0 bash -c 'for f; do mkdir -p "$";printf "%s/version\n" "$";done' arg0dummy > output
awk
Skript:
-F\;
definiert;
als Feldtrennzeichen, also$1
das erste Feld (vorher;
)gsub
wird verwendet um zu ersetzen.
mit/
printf
wird verwendet, um das Ergebnis zu drucken und ein abschließendes\0
Zeichen (null) einzufügen .
xargs
:
-0
: Eingabeelemente werden durch ein Nullzeichen statt durch Leerzeichen abgeschlossen, und die Anführungszeichen und der umgekehrte Schrägstrich sind nicht speziell (jedes Zeichen wird wörtlich genommen). Deaktiviert das Ende der Dateizeichenfolge, die wie jedes andere Argument behandelt wird. Nützlich, wenn Eingabeelemente Leerzeichen, Anführungszeichen oder umgekehrte Schrägstriche enthalten können.
bash -c ...
:
arg0dummy
: es wird nicht verwendet, ist aber obligatorisch; sehenman bash
.