在文件中搜索字符串的子文件夹,并删除匹配文件的删除父文件夹

时间:2015-08-10 19:39:22

标签: linux search find xargs

我一直在寻找相当长的一段时间,但还没有设法找到解决方案。我有以下文件夹结构:

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

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

我已经走到了这一步 - 但我很难将dirname {}传递给文件夹上的“rm -rf”命令。

找到。 -name'* asp'-mtime -180 | xargs grep -l'string'| xargs -I {} dirname {} | rm -rf

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

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

非常感谢!

1 个答案:

答案 0 :(得分:2)

你想做这样的事情:

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,则不会运行第三个表达式。第三个表达式打印传递前两个表达式的任何内容的dirname。然后,您将其导入sort -u以删除重复项,然后xarg将其移至rm -rf