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

时间:2012-06-02 21:05:52

标签: file bash unix

我需要将以下代码附加到目录及其子目录中的所有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

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

6 个答案:

答案 0 :(得分:70)

我通常使用T恤,因为我认为它看起来更清洁,通常适合一条线。

echo "my text" | tee -a *.php

答案 1 :(得分:14)

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命令使用-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

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

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

答案 2 :(得分:12)

您没有指定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

答案 3 :(得分:3)

您可以将sedfind结合使用。假设你的项目树是

    /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将为刚刚找到的所有.php传递(即运行)sed
    • sed将执行追加。 '$ r append.txt'表示转到文件末尾($)并写入(粘贴)append.txt中的任何内容。不要忘记-i否则只会打印出附加文件而不保存。
  3. 来源:http://www.grymoire.com/unix/Sed.html#uh-37

答案 4 :(得分:1)

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

#!/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:您必须从要浏览的目录中运行脚本

答案 5 :(得分:0)

灵感来自@Dantastic答案:

echo "my text" | tee -a file1.txt | tee -a file2.txt