在递归 rm -rf /folder/* 中排除具有特定文件的子文件夹

mr.*_*ing 4 linux bash

我想知道是否可以指定一些优雅的条件(可能是参数?)rm -rf /folder/*不删除其子文件夹,其中包含名称为“dontshoot.txt”的文件。

到目前为止我找不到任何东西。

在此先感谢您的帮助!

bue*_*rgi 7

你可以简单地find像这样使用

find some_folder ! -name dontshoot.txt -delete
Run Code Online (Sandbox Code Playgroud)

这将递归删除除文件之外的所有文件和文件夹dontshoot.txt。正如其他评论中所指出的,在不删除的情况下测试它总是有帮助的,这可以像这样简单地完成。

find some_folder ! -name dontshoot.txt 
Run Code Online (Sandbox Code Playgroud)

但是,这将列出所有文件夹,即使是那些包含dontshoot.txt但不会被删除的文件夹,因为它们在使用-delete.

编辑:

我同意 fedorqui 对这个问题的解释比我的更合理。只删除不包含dontshoot.txt在其树结构深处的文件夹,一个可怕的低效解决方案是

find some_folder -type d -exec \
   sh -c "find {} -name dontshoot.txt | grep -q '' || echo rm -fr {}" \;
Run Code Online (Sandbox Code Playgroud)

解释:

外部find命令通过some_folder查找所有目录 ( -type d) 并执行 ( -exec) 给定的 shell 命令递归遍历,同时替换{}为找到的目录的相对路径。

findshell 中的命令在找到的目录中搜索dontshoot.txt. 如果没有找到任何内容,则不会传递任何输出grep -q '' ,因此将返回False并执行最后一部分,这将dontshoot.txt递归删除完整目录(当然不包含)。

简而言之,它遍历所有目录并删除那些不包含dontshoot.txt在其中某处的目录。