如何在Linux中的文件夹中的所有文件中附加和前置一些文本

时间:2012-07-23 06:30:22

标签: linux bash shell append prepend

我有如下文件夹结构

resources/folder1 , /folder2 , /folder3

现在我希望这个文本以换行符为前缀:

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

这应该附在底部

{% endblock %}

资源下的文件夹和子目录中的所有文件。这可能吗?

4 个答案:

答案 0 :(得分:2)

可能有无数种方法可以做到这一点。根据不包含空格等的文件名,您可以使用:

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

大括号对所附命令执行I / O重定向。在命令的同一行上准确使用它们有点棘手,但上面的代码很简单。如果您不在恶劣的环境中工作,则重定向到tmp.$$即可。如果您认为人们可能在您运行脚本时颠覆您,则可能需要使用mktemp或其他命令。如图所示完成的cprm意味着如果任何文件实际上是符号链接(或硬链接),则不会遇到问题;链接被保留。 mv tmp.$$ $file等替代方案会破坏链接或符号链接。

答案 1 :(得分:2)

您可以使用sed

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

答案 2 :(得分:2)

将目录更改为resources,创建两个模板文件:BEGINEND

档案:BEGIN

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

档案:END

{% endblock %}

运行命令:

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

没有反斜杠逃脱,这个解决方案非常简单明了,并且可以很好地扩展。

答案 3 :(得分:0)

最简单的方法是分两步:

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'