46

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

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

我试过了

echo "my text" >> *.php

但是终端显示错误:

bash : *.php: ambiguous redirect

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

4

6 回答 6

109

我通常使用 tee,因为我觉得它看起来更干净一些,而且它通常适合一条线。

echo "my text" | tee -a *.php
于 2014-01-10T22:42:01.270 回答
22

你没有指定shell,你可以试试这个foreach命令。在 tcsh 下(我确信 bash 有一个非常相似的版本),您可以交互式地说:

foreach i (*.php)
foreach> echo "my text" >> $i
foreach> end

$i每次循环都会使用每个文件的名称。

与往常一样,在对大量文件进行操作时,最好在包含示例文件的小目录中对其进行测试,以确保其按预期工作。

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

for i in *.php
do 
   echo "my text" >> $i
done

如果您想覆盖您所在目录下的多个目录,您可以指定

*/*.php

而不是*.php

于 2012-06-02T21:08:59.353 回答
20

BashFAQ/056很好地解释了为什么您尝试的方法不起作用。看一看。

由于您使用的是 bash (根据您的错误),因此该for命令是您的朋友。

for filename in *.php; do
  echo "text" >> "$filename"
done

如果您想从文件中提取“文本”,您可以这样做:

for filename in *.php; do
  cat /path/to/sourcefile >> "$filename"
done

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

find . -name "*.php" -type f -exec sh -c "cat /path/to/sourcefile >> {}" \;

该命令使用和之find类的条件识别哪些文件,然后该命令的运行与我在前面的“for”循环中向您展示的基本相同。final表示这是选项参数的结尾。-name-type-exec\;find-exec

您可以man find了解有关此的更多详细信息。

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

shopt -s globstar
for filename in **/*.php; do
  cat /path/to/sourcefile >> "$filename"
done

您可以man bash搜索“globstar”以获取更多详细信息。此选项需要 bash 版本 4 或更高版本。

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

于 2012-06-02T21:18:11.093 回答
6

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

    /MyProject/ 
    /MyProject/Page1/file.php
    /MyProject/Page2/file.php
    etc.        
  1. 保存要附加的代码/MyProject/。称它为append.txt
  2. /MyProject/运行:

    find . -name "*.php" -print | xargs sed -i '$r append.txt'
    

    解释:

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

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

于 2014-01-25T05:31:19.733 回答
2

您可以这样做(即使文件路径中有空间也可以工作):

#!/bin/bash

# Create a tempory file named /tmp/end_of_my_php.txt
cat << EOF > /tmp/end_of_my_php.txt
</div>
<div id="preloader" style="display:none;position: absolute;top: 90px;margin-left: 265px;">
<img src="ajax-loader.gif"/>
</div>
EOF

find . -type f -name "*.php" | while read the_file
do
    echo "Processing $the_file"
    #cp "$the_file" "${the_file}.bak" # Uncomment if you want to save a backup of your file
    cat /tmp/end_of_my_php.txt >> "$the_file"
done

echo
echo done

PS:必须从要浏览的目录运行脚本

于 2012-06-03T06:31:57.303 回答
1

灵感来自@Dantastic 答案:

echo "my text" | tee -a file1.txt | tee -a file2.txt
于 2019-12-06T16:48:46.650 回答