我使用该命令以递归方式在当前目录及其子目录的php文件的开头添加一行。
find . -name "*.php" -exec sed -i -e "/<?php/a\\
Sometext" *.php \;
但是它仅在当前目录(而不是全部)的php文件中添加Sometext
多次(而不是一次)。我做错了什么?
答案 0 :(得分:5)
您不会将find
找到的文件传递给sed
命令,而是将shell glob *.php
找到的文件传递给。在执行find
之前,请展开*.php
,您的命令将变为
find . -name '*.php' -exec sed ... 1stMatch.php 2ndMatch.php ... \;
然后,find
将为找到的每个文件执行命令
sed ... 1stMatch.php 2ndMatch.php ...
您可能想写
find . -name '*.php' -exec sed -i -e '/<?php/a\\
Sometext' {} \;
对于每个文件,find
执行sed
并将{}
替换为一个文件名。
在这种情况下,您甚至可以编写{} +
而不是{} \;
,这样sed
一次对所有文件执行一次,而不是对每个文件执行一次–这样可以加快命令的执行速度