zshs „echo SomeText >> **/filename“ in anderen Shells

zshs „echo SomeText >> **/filename“ in anderen Shells

Ich muss alle Dateien mit einem bestimmten Dateinamen (rekursiv) mit einem Text füllen. In zsh kann dies mit

echo SomeText > **/TheFileName

Ich suche nach generischen Lösungen für sh-kompatible und/oder tcsh-Shells. Gibt es einen kürzeren/einfacheren Weg als den folgenden Befehl?

find . -name "TheFileName" -print0 | xargs -0 sed -n -i -e '1c\nSomeText'

Antwort1

find . -name TheFileName -type f -exec sh -c 'for i do
     echo SomeText > "$i"; done' sh {} +

Antwort2

Sie können teehierfür verwenden:

Wenn Ihre Shell die korrekte Übereinstimmung aufweist **/TheFileNameund das Problem lediglich darin besteht, den Inhalt jeder Datei abzurufen:

echo SomeText | tee **/TheFileName >/dev/null

Wenn das Problem darin besteht, dass **/TheFileNamedie Übereinstimmung nicht richtig ist, können Sie Folgendes verwenden find:

echo SomeText | find . -name TheFileName -exec tee {} + >/dev/null

Wenn Ihr findnicht über verfügt -exec +, sind die anderen Lösungen hier geeignet.

Diese funktionieren auch nicht, wenn Sie eine sehr große Anzahl von Dateien haben (größer als getconf ARG_MAX).

Antwort3

Etwas kürzer:

find . -name TheFileName -type f -exec sed -n -i -e '1c SomeText' {} +

verwandte Informationen