使用find删除除某个子目录中的所有文件以外的所有文件

外来蛋白

我想递归地删除该文件夹中一段时间​​未访问的a所有文件,但子文件夹中的所有文件除外b

find a \( -name b -prune \) -o -type f -delete

但是,我收到一条错误消息:

查找:-delete操作自动打开-depth,但是当-depth有效时,-prune不执行任何操作。如果仍要继续,则只需显式使用-depth选项。

添加-depth会导致b其中包含所有文件,这一定不会发生。

任何人都知道一种安全的方法来完成这项工作吗?

莱斯曼纳

一种方法是使用-exec rm而不是-delete

find a \( -name b -prune \) -o -type f -exec rm {} +

或者使用-not -path代替-prune

find a -not -path "*/b*" -type f -delete

解释为什么-prune会与发生冲突-delete

当您尝试使用查找抱怨-delete-prune-delete暗示-depth-depth使得-prune无效的。

观察使用和不使用find的行为-depth

$ find foo/
foo/
foo/f1
foo/bar
foo/bar/b2
foo/bar/b1
foo/f2

不能保证单个目录中的订单。但是可以保证在目录内容之前先对其进行处理。注意foo/之前foo/*foo/bar之前foo/bar/*

可以用反转-depth

$ find foo/ -depth
foo/f2
foo/bar/b2
foo/bar/b1
foo/bar
foo/f1
foo/

请注意,现在所有内容都foo/*出现在之前foo/与相同foo/bar

更多说明:

  • -prune防止查找下降到目录中。换句话说,-prune跳过目录的内容。就您而言,这-name b -prune意味着当find到达具有该名称的目录时b,它将跳过该目录,包括所有子目录。
  • -depth可以在目录本身之前先处理目录的内容。这意味着,当find查找到处理目录条目时,b其内容已被处理。因此-prune实际上是无效的-depth
  • -delete意味着-depth它可以先删除内容,然后删除空目录。-delete拒绝删除非空目录。

替代方法的说明:

find a -not -path "*/b*" -type f -delete

这可能容易记住,也可能不容易记住。

该命令仍然会进入目录b并处理其中的每个文件,仅用于-not拒绝它们。如果目录b很大,这可能是性能问题

-path工作原理与有所不同-name-name仅匹配(文件或目录的)名称,而-path匹配整个路径。例如,观察路径/home/lesmana/foo/bar-name bar将匹配,因为名称是bar-path "*/foo*"将匹配,因为字符串/foo在路径中。-path使用前,您应该了解一些复杂的知识。阅读的手册页以find获取更多详细信息。

请注意,这不是100%的万无一失。有可能出现“误报”。该命令上方的编写方式将跳过具有其父目录以b(正)开头的任何父目录的文件但是,b无论树中的位置如何,它都将跳过名称以其开头的任何文件(误报)。可以通过编写一个比更好的表达式来解决此问题"*/b*"这留给读者作为练习。

我假设您使用ab作为占位符,真实姓名更像allosaurusbrachiosaurus如果您brachiosaurus替换掉,b那么误报的数量将大大减少。

至少不会误报,因此不会那么可悲。此外,您可以通过先不带命令运行命令来检查误报-delete(但请记住放置隐含的-depth)并检查输出。

find a -not -path "*/b*" -type f -depth

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从所有子目录删除文件,保留一个子目录以外的文件夹结构

如何从某个目录中删除所有文件,但该目录的子目录除外?

Git,忽略除子目录中的一些文件以外的所有文件

如何使用单个find命令更改除1个文件夹以外的所有子目录的权限?

删除所有子目录中的匹配文件

递归删除除几个子目录外的所有子目录

PHP:使用 scandir 从多个子目录中获取所有 zip 文件

使用find排除所有子目录的文件

删除除与特定模式匹配的子目录以外的所有子目录

如何删除除目录中的文件以外的所有文件?

删除每个子目录中所有但最新的Pattern文件

如何删除所有子目录中具有给定名称的所有文件?

忽略除一个文件外的所有文件和子目录中的文件

从目录和所有子目录获取所有文件,但不包含一个子目录

如何使用vim打开当前目录和所有子目录中的所有文件?

删除子目录中所有文件的权限

查找目录及其子目录中的所有文件

Git会忽略某个目录的所有子目录中的某种类型的所有文件吗?

计算所有不可删除文件的总大小(包括子目录中的文件)

重命名所有子目录中的文件和文件夹以删除字符

忽略.gitignore中除一个子目录外的所有子目录

git排除文件夹中除子目录外的所有内容

如何忽略除单个文件之外的git仓库子目录中的所有内容?

删除所有文件和子目录,但保持当前目录空在Java中

PHP 删除目录和任何子目录中的所有空文件

使用git filter-branch删除除一个子目录外的所有内容

chmod文件仅在所有子目录中

Gitignore排除所有子目录中的某些文件

如何遍历所有子目录中的文件?