如何在目录及其子目录中的多个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
我通常使用"Tee",因为我认为它看起来更整洁,在一行内也比较容易放下。
echo "my text" | tee -a *.php
你没有指定 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
,不如
for i in $a do echo "the code" >> $i done
但是所有文件都被追加了两次,子目录中的文件没有任何变化。 - Harikrishnan$i
以处理文件名中包含空格的情况。 - David FarrellBashFAQ/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" 循环中展示的相同的内容。最后的 \;
表示对于 -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或更高版本。?>
结尾,因此你可能正在添加HTML代码,而脚本会尝试将其解释为PHP代码。sed
与 find
结合使用。假设您的项目目录树为: /MyProject/
/MyProject/Page1/file.php
/MyProject/Page2/file.php
etc.
/MyProject/
. Call it append.txt
From /MyProject/
run:
find . -name "*.php" -print | xargs sed -i '$r append.txt'
Explain:
find
does as it is, it looks for all .php, including subdirectoriesxargs
will pass (i.e. run) sed
for all .php that have just been foundsed
will do the appending. '$r append.txt' means go to the end of the file ($) and write (paste) whatever is in append.txt there. Don't forget -i
otherwise it will just print out the appended file and not save it.#!/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:您必须从要浏览的目录中运行脚本。
echo "my text" | tee -a file1.txt | tee -a file2.txt
echo "my text" | tee -a file1.txt | tee -a file2.txt >/dev/null
- MrPotatoHeadecho "my text" | tee -a file1.txt file2.txt
,无需再次使用管道操作。 - Peter
echo "my text" | tee -a **/*.php
如果需要的话 :) - Mark