Как я могу добавить и добавить некоторый текст ко всем файлам в папке в Linux

У меня есть структура папок, как показано ниже

resources/folder1 , /folder2 , /folder3

Теперь я хочу, чтобы этот текст был дополнен символами новой строки:

{% extends '::layout.html.twig' %}
{% block body %}

и это должно быть добавлено внизу

{% endblock %}

всех файлов в папке и подкаталогах в разделе Ресурсы. Это возможно?

4 ответа

Решение

Изменить каталог на resourcesсоздайте два файла шаблона: BEGIN а также END,

Файл: НАЧАТЬ

{% extends '::layout.html.twig' %}
{% block body %}

Файл: END

{% endblock %}

Запустите команды:

sed -i '1s/^/\n/' */*
sed -i -e '1rBEGIN' -e '$rEND' */*
sed -i '1d' */*

Никакой обратной косой черты не избежать, это решение очень простое и понятное и хорошо масштабируется.

Вы можете сделать это с sed:

 sed -i -e "
 1s/^/\n{% extends '::layout.html.twig' %}\n{% block body %}\n/ ;
 $s/$/\n{% endblock %}/
 " $(ls -R resources/folder* )

Есть, вероятно, множество способов сделать это. При условии, что имена файлов не содержат пробелов и т.п., вы можете использовать:

find resources -type f -print |
while read file
do
    {
    echo "{% extends '::layout.html.twig' %}"
    echo "{% block body %}"
    cat $file
    echo "{% endblock %}"
    } > tmp.$$
    cp tmp.$$ $file
    rm -f tmp.$$
done

Набор фигурных скобок выполняет перенаправление ввода / вывода для вложенных команд. Их немного сложно использовать точно в одной строке с командами, но приведенный выше код прост. Перенаправление на tmp.$$ В порядке, если вы не работаете в агрессивной среде; вам может понадобиться mktemp или какая-то другая команда, если вы думаете, что люди могут подорвать вас, пока вы запускаете скрипт. cp а также rm Выполнение, как показано, означает, что вы не столкнетесь с проблемами, если какой-либо из файлов фактически является символической ссылкой (или жесткой ссылкой); ссылки сохранены. Альтернативы, такие как mv tmp.$$ $file сломал бы ссылки или символические ссылки.

Самый простой способ будет в два этапа ИМО:

egrep -r -l "{% extends '::layout.html.twig' %}" resources/ |xargs sed -i 's/ \{\%\ extends\ \'\:\:layout\.html\.twig\'\ \%\} /\n \{\%\ extends\ \'\:\:layout\.html\.twig\'\ \%\}/g'

а потом:

egrep -r -l "{% extends '::layout.html.twig' %}" resources/ |xargs sed '$ a\\n'
Другие вопросы по тегам