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

在Linux中,如何向文件夹中的所有文件追加和前置一些文本,linux,bash,shell,append,prepend,Linux,Bash,Shell,Append,Prepend,我的文件夹结构如下所示 资源/folder1、/folder2、/folder3 现在,我希望此文本前面有换行符: {% extends '::layout.html.twig' %} {% block body %} 这应该附加在底部 {% endblock %} 资源下的文件夹和子目录中的所有文件。这可能吗?可能有很多方法可以做到这一点。根据不包含空格等的文件名,您可以使用: find resources -type f -print | while read file do {

我的文件夹结构如下所示

资源/folder1、/folder2、/folder3

现在,我希望此文本前面有换行符:

{% extends '::layout.html.twig' %}
{% block body %}
这应该附加在底部

{% endblock %}

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

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

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或其他命令。如图所示完成的cp和rm意味着您不会遇到任何文件实际上是符号链接或硬链接的问题;链接将被保留。mv tmp。$$$文件等替代文件会断开链接或符号链接。

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

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或其他命令。如图所示完成的cp和rm意味着您不会遇到任何文件实际上是符号链接或硬链接的问题;链接将被保留。替代方案,如mv tmp。$$$文件会断开链接或符号链接。

您可以使用sed:

您可以通过sed实现这一点:

将目录更改为资源,创建两个模板文件:开始和结束

文件:开始 档案:完 运行命令: 不再出现反斜杠,此解决方案非常清晰、简单,并且可扩展性很好。

将目录更改为参考资料,创建两个模板文件:开始和结束

文件:开始 档案:完 运行命令:
不再出现反斜杠,此解决方案非常清晰、简单,并且具有良好的伸缩性。

最简单的方法是分两步进行:

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'

最简单的方法是分两步进行:

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'

我得到这个错误sed:-e表达式1,char 89:未知命令:\'`我得到这个错误sed:-e表达式1,char 89:未知命令:\'`谢谢你的工作。这很容易理解。唯一的问题是当有子记录时它会给出错误,因为它试图应用于该子记录well@Zombie21. 如果文件扩展名为.html,请使用*/*.html。如果要应用于子目录中的所有文件,请尝试shopt-s globstar,并使用**/*.htmlooks,这是一个很好的解决方案,但不适用于我的情况。。。我想在当前目录下做,并且只对特定的文件类型做。谢谢你,伙计。这很容易理解。唯一的问题是当有子记录时它会给出错误,因为它试图应用于该子记录well@Zombie21. 如果文件扩展名为.html,请使用*/*.html。如果要应用于子目录中的所有文件,请尝试shopt-s globstar,并使用**/*.htmlooks,这是一个很好的解决方案,但不适用于我的情况。。。我想在当前目录中执行此操作,并且只对特定的文件类型执行此操作。对于具有N个链接的文件,这将附加页眉/页脚N次。但这是可以修复的,而sed-i解决方案打破了硬链接。谢谢您的编辑,@williampersell。因为这是标记为Linux的,所以GNU sed-i特性通常是可用的。链接和符号链接通常会导致问题。如果存在多个连接问题,那么您可能会安排生成一个文件名加inode编号的列表,仅对inode编号进行唯一排序,然后只处理一次对应的名称。但是它比sed-i和公认的sed-i更详细,没有这两个辅助文件也可以编写。sed-i没有那么详细,但它会断开硬链接并使用辅助文件!这将为具有N个链接的文件追加页眉/页脚N次。但这是可以修复的,而sed-i解决方案打破了硬链接。谢谢您的编辑,@williampersell。因为这是标记为Linux的,所以GNU sed-i特性通常是可用的。链接和符号链接通常会导致问题。如果存在多个连接问题,那么您可能会安排生成一个文件名加inode编号的列表,仅对inode编号进行唯一排序,然后只处理一次对应的名称。但是它比sed-i和公认的sed-i更详细,没有这两个辅助文件也可以编写。sed-i没有那么详细,但它会断开硬链接并使用辅助文件!
egrep -r -l "{% extends '::layout.html.twig' %}" resources/ |xargs sed '$ a\\n'