Eine Datei finden und Text senden

285
Piotr G

Ich möchte eine Datei in einem Ordner finden /optund Text senden. Ich habe folgende Syntax ausprobiert:

sudo find /opt -name filename-*.conf | xargs -I '{}' echo "text_to_send" > '{}' \; 

Leider finde ich danach die Datei, {}die den Text enthält. Ich habe versucht, mit '{}'als auch {}, "{}", \{\}, aber in dem Befehl, aber nichts richtig als Platzhalter für die Dateinamen gefunden zu funktionieren scheint. Was ist die richtige Syntax?

0

2 Antworten auf die Frage

0
Zaroth

Versuche dies:

sudo find /opt -name filename-*.conf -exec bash -c 'echo "text_to_send" > {}' \; 

Das bash -cist notwendig, um die Weiterleitung >in Anführungszeichen zu setzen find -exec.

Danke, diese Antwort ist technisch in Ordnung, wenn sie in einer Konsole ausgeführt wird. Leider funktionierte sie aus irgendeinem Grund nicht für die Bereitstellung in einer Vagrant-Datei. Vagrant beklagte sich über keine Attribute für -exec. Piotr G vor 6 Jahren 0
0
Kamil Maciorowski

Ich denke, >wird in der aktuellen Shell interpretiert. Dasselbe gilt für *, wenn Sie also filename-A.conf(oder schlimmer noch mehr übereinstimmende Dateien) im aktuellen Verzeichnis haben, dann wird das Kommando durch Shell-Globbing weiter zerstört. Beachten Sie auch: Ihre Bewerbung sudogilt findnur für, nicht für xargs.

Versuchen Sie es mit ( sudowenn nötig):

find /opt -name 'filename-*.conf' -print0 | xargs -r0 sh -c 'echo "text_to_send" | tee "$0" "$@"' > /dev/null 

Warnung: tee überschreibt Dateien (wie >auch, also denke ich, das ist es was Sie wollen); verwenden tee -aanhängen.

  • find -print0und xargs -0sogar mit ausgefallenen Dateinamen arbeiten,
  • xargs -r wird nicht ausgeführt, wenn keine Datei gefunden wird.
  • sh handhabt das innere Rohr
  • $0" "$@"übergibt auf sichere Weise alle Dateinamen (postpended by xargs) an den Befehl unter sh,
  • tee behandelt eine oder mehrere gefundene Dateien,
  • Die letzte Umleitung soll verhindern, dass text_to_sendsie in Ihrem Terminal erscheint.
Diese Lösung funktioniert auch in einer Vagrant-Datei, aber es gab einige Probleme mit `text_to_send`, die` '' `enthielten, die immerhin gelöscht wurden. Irgendwann musste ich auf eine andere Lösung zurückgreifen, aber diese gab mir trotzdem einen guten Einblick, also danke. Piotr G vor 6 Jahren 0