在Linux中将文本附加到多个文件的末尾

Har*_*nan 26 unix bash file

我需要将以下代码附加到目录及其子目录中的所有php文件的末尾:

</div>
<div id="preloader" style="display:none;position: absolute;top: 90px;margin-left: 265px;">
<img src="ajax-loader.gif"/>
</div>
Run Code Online (Sandbox Code Playgroud)

我试过了

echo "my text" >> *.php
Run Code Online (Sandbox Code Playgroud)

但终端显示错误:

bash : *.php: ambiguous redirect
Run Code Online (Sandbox Code Playgroud)

我该怎么办.有数百个文件要添加这个代码段,在每个文件中添加它会非常困难.提前致谢.

小智 81

我通常使用T恤,因为我认为它看起来更干净,通常适合一条线.

echo "my text" | tee -a *.php
Run Code Online (Sandbox Code Playgroud)


Lev*_*von 14

您没有指定shell,您可以尝试该foreach命令.在tcsh下(我确定一个非常类似的版本可用于bash)你可以说交互式的东西:

foreach i (*.php)
foreach> echo "my text" >> $i
foreach> end
Run Code Online (Sandbox Code Playgroud)

$i 每次循环时都会显示每个文件的名称.

与往常一样,当对大量文件进行操作时,在带有示例文件的小目录中测试它们可能是个好主意,以确保它按预期工作.

糟糕.. bash错误消息(我会用它标记您的问题).等效循环将是

for i in *.php
do 
   echo "my text" >> $i
done
Run Code Online (Sandbox Code Playgroud)

如果要覆盖您可以指定的目录下方的多个目录

*/*.php
Run Code Online (Sandbox Code Playgroud)

而不是 *.php

  • "find"命令更适合子目录. (3认同)

gho*_*oti 14

BashFAQ/056做了很好的解释为什么你尝试的东西不起作用.看一看.

由于您正在使用bash(根据您的错误),该for命令是您的朋友.

for filename in *.php; do
  echo "text" >> "$filename"
done
Run Code Online (Sandbox Code Playgroud)

如果您想从文件中提取"文本",则可以执行以下操作:

for filename in *.php; do
  cat /path/to/sourcefile >> "$filename"
done
Run Code Online (Sandbox Code Playgroud)

现在......您可能在子目录中有文件.如果是这样,您可以使用该find命令来查找和处理它们:

find . -name "*.php" -type f -exec sh -c "cat /path/to/sourcefile >> {}" \;
Run Code Online (Sandbox Code Playgroud)

find命令识别哪些文件使用条件像-name-type,然后在-exec命令基本上运行我发现你在以前的"for"循环同样的事情.最后的结果\;表明find这是该-exec选项的参数结束.

您可以获得man find更多有关此内容的详细信息.

find命令是可移植的,通常建议用于此类活动,特别是如果您希望您的解决方案可移植到其他系统.但是,由于您当前正在使用bash,您也可以使用bash的globstar选项处理子目录:

shopt -s globstar
for filename in **/*.php; do
  cat /path/to/sourcefile >> "$filename"
done
Run Code Online (Sandbox Code Playgroud)

您可以man bash搜索"globstar"以获取更多有关此内容的详细信息.此选项需要bash版本4或更高版本.

注意:您可能还有其他问题.PHP脚本不需要以a结尾?>,因此您可能会添加脚本将尝试将其解释为PHP代码的HTML.


小智 6

您可以sed 结合使用find。假设您的项目树是

    /MyProject/ 
    /MyProject/Page1/file.php
    /MyProject/Page2/file.php
    etc.        
Run Code Online (Sandbox Code Playgroud)
  1. 保存要附加的代码/MyProject/。称它为append.txt
  2. /MyProject/运行:

    find . -name "*.php" -print | xargs sed -i '$r append.txt'
    
    Run Code Online (Sandbox Code Playgroud)

    解释:

    • find 照原样,它会查找所有 .php,包括子目录
    • xargs将通过(即运行)sed所有刚刚找到的 .php
    • sed会做追加。'$r append.txt' 意味着转到文件的末尾($)并写入(粘贴)append.txt 中的任何内容。不要忘记,-i否则它只会打印出附加的文件而不保存它。

来源:http : //www.grymoire.com/unix/Sed.html#uh-37