xargs mit zwei befehlen - mkdir und sed

657
diego9403

Ich möchte Kataloge erstellen und in derselben Zeile möchte ich den Pfad ändern und in der Ausgabedatei speichern. Ich möchte keinen Code wiederholen, also habe ich versucht:

cut -d ';' -f 1 tmp1 | tr '.' '/' | xargs -I % bash -c 'mkdir -p %; sed 's/$/\/version/'% > output' 

Und ich habe einen Fehler:

sed: -e expression #1, char 6: unknown option to `s' 

Wissen Sie, was ich falsch mache?

1

1 Antwort auf die Frage

1
Jay jargot

Der Fehler wurde generiert, weil Sie viele verwenden '. Insbesondere s/$/\/version/liegt außerhalb eines einzelnen Zitats.

sedarbeitet entweder an einer Datei oder an der Standardeingabe. Eine als Parameter übergebene Zeichenfolge kann nicht geändert werden. printfeingebauter Befehl kann zum Anhängen verwendet werden /version.

Bemerkungen:

  • Für jede aus der tmp1Datei gelesene Zeile wird ein Name extrahiert, daher enthalten die Namen nicht \n.
  • Je nach Verwendung von cutund enthalten trdie 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).

cutund trkann nur durch einen ersetzt werden, mit awkdem xargs -0die 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 $1das erste Feld (vorher ;)
  • gsubwird verwendet um zu ersetzen .mit/
  • printfwird verwendet, um das Ergebnis zu drucken und ein abschließendes \0Zeichen (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; sehen man bash.