找-mindepth -prune冲突?

时间:2014-09-10 18:47:36

标签: find

我的目标结构如下:

gameplay/ch1_of_182/ajax.googleapis.com/...
gameplay/ch1_of_182/platform.twitter.com/...
gameplay/ch1_of_182/privacy-policy.truste.com/...
gameplay/ch1_of_182/www.facebook.com/...
gameplay/ch1_of_182/www.gameplay.com/...
gameplay/ch1_of_182/www-mega.gameplay.com/...
gameplay/ch2_of_182/ajax.googleapis.com/...
gameplay/ch2_of_182/platform.twitter.com/...
gameplay/ch2_of_182/privacy-policy.truste.com/...
gameplay/ch2_of_182/www.facebook.com/...
gameplay/ch2_of_182/www.gameplay.com/...
gameplay/ch2_of_182/www-mega.gameplay.com/...
...
gameplay/ch182_of_182/ajax.googleapis.com/...
gameplay/ch182_of_182/platform.twitter.com/...
gameplay/ch182_of_182/privacy-policy.truste.com/...
gameplay/ch182_of_182/www.facebook.com/...
gameplay/ch182_of_182/www.gameplay.com/...
gameplay/ch182_of_182/www-mega.gameplay.com/...

使用wget创建。现在我要删除所有目录及其包含的所有文件,除了名称中带有“gameplay.com”的两个目录。

我一直在尝试不同的变体:

find . -mindepth 2 ! -path "*gameplay.com" -prune -exec rm -r {} \;

但没有运气。

从游戏性父目录运行时,不包含“gameplay.com”名称模式的182个目录(实际上仅用于测试目的)中的6个目录中的4个目录及其所有内容都将被删除, 如预期的。虽然包含“gameplay.com”名称模式的2个目录未被删除,但每个目录中包含的所有文件都被删除,这是不好的。

我认为-prune选项应该让find知道基本上忽略指定的目录,但是我必须指定错误,因为那不会发生,留下我有两个空目录182个父母的每一个。

我认为与-mindepth-prune选项存在潜在冲突,但是因为我从游戏性父目录运行命令,没有它所有182个子目录,每个目录包含两个目录想要离开,被删除。

我想我可以编写一个for循环来循环到每个目录,但在我看来find应该能够在一次犯规中完成这项任务,如果有人不介意脱掉一些如何。

1 个答案:

答案 0 :(得分:1)

逻辑上,这是find . -mindepth 2 \( ! -path "*gameplay.com" \) -a \( -prune \) -a \( -exec rm -r {} \; \)

因此,由于您的-prune位于路径检查之后,如果您的路径检查为false,则永远不会得到它。尝试切换订单。

find . -mindepth 2 -prune ! -path "*gameplay.com" -exec rm -r {} \;