Versuche dies:
sudo find /opt -name filename-*.conf -exec bash -c 'echo "text_to_send" > {}' \;
Das bash -c
ist notwendig, um die Weiterleitung >
in Anführungszeichen zu setzen find -exec
.
Ich möchte eine Datei in einem Ordner finden /opt
und 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?
Versuche dies:
sudo find /opt -name filename-*.conf -exec bash -c 'echo "text_to_send" > {}' \;
Das bash -c
ist notwendig, um die Weiterleitung >
in Anführungszeichen zu setzen find -exec
.
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 sudo
gilt find
nur für, nicht für xargs
.
Versuchen Sie es mit ( sudo
wenn 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 -a
anhängen.
find -print0
und xargs -0
sogar 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,text_to_send
sie in Ihrem Terminal erscheint.