如何使用 find 删除早于或晚于 N 天的文件(附加示例)

[ad_1]

本文解释了如何删除早于或晚于 N 天的文件,并提供了额外的示例,例如仅匹配使用特定扩展名的文件等。 为此,我们将使用
find

,一个用于在目录中搜索文件的命令行工具。

您可以使用以下命令从目录中删除早于(文件的数据修改时间早于)N 天的所有文件和文件夹:

find /directory/path/ -mindepth 1 -mtime +N -delete

整个命令的说明以及您需要替换的内容:

  • find 是用于查找文件(以及更多)的 Unix 命令行工具
  • /directory/path/ 是查找(和删除)文件的目录路径。 将其替换为要从中删除早于以下时间的文件和文件夹的目录的路径 N
  • -mindepth 1 用于在低于指定级别的级别上不应用任何测试或操作。 -mindepth 1 意味着该命令应该处理除命令行参数之外的所有文件。 如果不使用它,该命令将尝试同时删除 /directory/path/ 如果它匹配 find 标准。 如果您还想匹配指定的查找路径,则可以在本文中提到的所有命令中跳过它。 此外,如果您只查找文件(-type f 例如,对于常规文件),而不是文件夹
  • -mtime +N 用于匹配 N 天前最后修改其数据(内容)的文件。 代替 N 一个数字(整数)。 在此命令中,修改时间早于 N 天将被删除。 需要注意的是,例如,如果文件最后一次修改是在 1 天 23 小时前, -mtime +1 不匹配,将其视为文件上次修改时间为 1 天 0 小时 0 分 0 秒前; 看到这个解释为什么会这样,由于 find 手册页做得不太好
  • -delete 删除匹配的文件和文件夹

需要注意的是 -delete 是 GNU 扩展,因此并非全部可用 find 实现。 有关删除适用于所有实现的文件的其他方法,请阅读本文后面的观察。

想要
在不删除任何文件或文件夹的情况下测试命令
? 消除
-delete

并且该命令将列出它找到的与您的条件匹配的所有文件,而不删除它们:

find /directory/path/ -mindepth 1 -mtime +N

让我们看一个例子。 要从 ~/Downloads 文件夹中删除超过 10 天的所有文件和文件夹,您可以使用:

find ~/Downloads -mindepth 1 -mtime +10 -delete

要删除所有比(文件修改时间比)N 天新的文件和文件夹,请使用 -N 代替 +N

find /directory/path/ -mindepth 1 -mtime -N -delete

我们将从现在到 10 天前从 ~/Downloads 中删除其内容被修改的所有文件和文件夹的示例:

find ~/Downloads -mindepth 1 -mtime -10 -delete

基于 Gtk 的 Linux 终端的 179 种配色方案(Gnome 终端、Tilix、Xfce 终端等)

我建议阅读一些重要的观察结果:

  1. 参数顺序很重要! 你应该添加 -delete 匹配文件后。 如果是第一个参数,则每个文件(和文件夹)都将从中删除 /directory/path/,无论它们是否与您的查询匹配。 所以总是添加 -delete 在命令的末尾。
  2. 并非所有版本 find 支持 -delete,这是一个 GNU 扩展。 万一 find 您使用的版本不支持 -delete, 您可以使用 -exec rm -rf {} +,虽然有 find 从我读过的内容来看,不支持这一点的版本。 使用 -exec rm -rf {} + 删除超过 N 天的文件,并且只删除匹配的文件(保留空子目录):
    find /directory/path/ -mindepth 1 -type f -mtime +N -exec rm -rf {} +

    这将执行一个 rm 命令及其匹配的文件列表。 此外,这确保将带有空格的文件名传递给执行的 rm 命令而不会被 shell 拆分。 还值得注意的是,即使 rm-rf 这里的参数,它只会删除文件,因为我们指定了 -type -f (仅匹配文件)。

  3. 应该与任何查找版本一起使用的是 exec rm {} ;. 然而,这比已经提到的其他两个解决方案的性能更差,因为它为它删除的每个文件生成一个外部进程。 这就是为什么我把这个解决方案留到最后。 使用它从目录中删除所有早于 X 天的文件和文件夹:
    find /directory/path/ -mindepth 1 -mtime +N -exec rm -rf {} ;

使用 find 根据修改时间删除文件或文件夹的其他示例

只删除超过 N 天的常规文件,保留空子目录:

find /directory/path/ -mindepth 1 -type f -mtime +N -delete

这里我们使用了
-type f

仅匹配常规文件。 你也可以使用
-type d

匹配文件夹,或
-type l

以匹配符号链接。

只从目录及其所有子目录中删除匹配 .extension 早于 N 天的文件:

find /directory/path/ -type f -mtime +N -name '*.extension' -delete

你可以
添加 -maxdepth 1 防止命令通过子目录,并且只删除文件和第一级深度目录:

find /directory/path/ -mindepth 1 -maxdepth 1 -mtime +N -delete

你也可以
利用 -ctime +N, 用于匹配(并在本例中删除)其状态在 N 天前最后一次更改的文件(文件属性/元数据和/或文件内容已修改)
, 而不是
-mtime

, 仅根据文件内容的最后修改时间匹配文件:

find /directory/path/ -mindepth 1 -ctime +N -delete

您可能喜欢:Bash 历史:如何在执行每个命令时显示时间戳

[ad_2]

Related Posts