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 tee
hierfür verwenden:
Wenn Ihre Shell die korrekte Übereinstimmung aufweist **/TheFileName
und das Problem lediglich darin besteht, den Inhalt jeder Datei abzurufen:
echo SomeText | tee **/TheFileName >/dev/null
Wenn das Problem darin besteht, dass **/TheFileName
die Übereinstimmung nicht richtig ist, können Sie Folgendes verwenden find
:
echo SomeText | find . -name TheFileName -exec tee {} + >/dev/null
Wenn Ihr find
nicht ü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' {} +