我需要递归地查找包含特定字符串的所有文件,以便我可以将新文件复制到旧文件上。例如:
如果文件包含字符串“replace me”:
找到文件的完整路径:
/dir/of/file/filename.php /dir/of/different/file/filename.php
用我的新文件替换该文件
filename.php
。
这听起来很简单,但我已经浪费了好几个小时了,毫无进展。
答案1
伊格纳西奥的解决方案withfind
可能是最好的方法。这里包含了评论中的所有详细信息。我专门只搜索文件(而不是目录),然后将三个语句分组到一个组中,并使用 或 语句来匹配任何名称:
find /dir/ \
-type f \
\( -name timthumb.php -or -name thumb.php -or -name rt-timthumb.php \) \
-exec grep -q "timthumb" {} \; \
-exec cp filename.php {} \;
不过,您也可以仅使用 shell glob 模式来进行查找,如下所示:
shopt -s extglob
for file in /dir/**{timthumb,thumb,rt-timthumb}.php; do
grep -q 'timthumb' "$file" && cp filename.php "$file"
done
您还可以使用 grep 进行递归搜索而不是通配符。如果您有很多文件,这将很有用:
grep -l -R -Z 'timthumb' /dir/**thumb.php | while read -d $'\0' file; do
cp filename.php "$file"
done
在所有情况下,将“/dir/”替换为您要操作的基本路径,将“filename.php”替换为您要覆盖的源文件。根据需要报价。请注意,在上一个示例中,我使用了快捷方式来匹配名称与“*thumb.php”匹配的所有文件。您也可以在其他示例中执行此操作。在查找的情况下,您可以将整组 OR 语句放在括号中,然后只使用-name '*thumb.php'
.上述所有示例仅适用于与这些名称模式匹配且包含字符串“timthumb”的文件。
答案2
find some/dir \
-exec grep -q "replace me" {} \; \
-exec cp some/new/filename.php {} \;