我一直在寻找相当长的一段时间,但还没有设法找到解决方案。我有以下文件夹结构:
/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服务器上清理了大量注入的文件。
非常感谢!
答案 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
。