列出包含特定字符串的所有文件

列出包含特定字符串的所有文件

我需要递归地查找包含特定字符串的所有文件,以便我可以将新文件复制到旧文件上。例如:

如果文件包含字符串“replace me”:

  1. 找到文件的完整路径:

    /dir/of/file/filename.php
    /dir/of/different/file/filename.php
    
  2. 用我的新文件替换该文件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 {} \;

相关内容