【问题标题】:Search subfolders for string in files, and delete delete parent folder of matching file在文件中搜索字符串的子文件夹,并删除匹配文件的删除父文件夹
【发布时间】:2015-08-10 19:39:22
【问题描述】:

我一直在寻找很长一段时间,但还没有找到解决这个问题的方法。我有以下文件夹结构:

/root/website1/file1.asp
/root/website2/file2.txt

我想在 /root/ 下的所有文件夹(可以是多个级别)中搜索不超过 180 天且在文件中包含特定字符串的文件。如果文件包含字符串,则应删除它的父文件夹(以及文件本身)。如果 file2.txt 包含字符串,那么 /root/website2 应该被删除。

我已经做到了这一点 - 但我非常坚持将 dirname {} 传递给文件夹上的“rm -rf”命令。

找到 . -name '*asp' -mtime -180 | xargs grep -l '字符串' | xargs -I{} 目录名 {} | rm -rf

此外,如果在找到包含该字符串的第一个文件后搜索将移动到下一个文件夹,而不是继续在同一文件夹中搜索,那将是理想的。 (即只需返回然后删除唯一文件夹,因为文件夹中可能有许多匹配的文件)。最后,如果我可以遍历输入文件中的字符串列表以进行搜索,那就太好了。

基本上,我正在清理 Web 服务器上的大量注入文件。

非常感谢!

【问题讨论】:

    标签: linux search find xargs


    【解决方案1】:

    你想做这样的事情:

    find . -name "*.txt" -exec grep -q deleteme {} \; -exec dirname {} \; | sort -u | xargs rm -rf
    

    在上面的命令中,find 给出了三个表达式:-name "*.asp"-exec grep -q string {} \;-exec dirname {} \;。默认情况下,find 假定这三个表达式由-and 运算符连接。 Find 将从左到右评估表达式,直到知道结果。因此,如果文件名与 *.asp 不匹配,它不会运行第二个表达式(因为 false 并且任何内容都是 false...)。如果grep -q string {} \; 不返回0,则不会运行第三个表达式。第三个表达式打印通过前两个表达式的任何内容的目录名。然后,您将其传送到 sort -u 以删除重复项,并将 xarg 传送到 rm -rf

    【讨论】:

    • 此命令无效。但是,如果它包含使用此命令的特定文本,我可以打印文件父目录
    • find -type f -exec grep -l "TEXT" {} \; -printf '%h\n'