如何删除今天未创建的所有文件

如何删除今天未创建的所有文件

我想要delete all今天未创建的文件夹中的文件。我知道如何获取今天使用创建的文件列表

find . -type f -mtime -1

但是,我不知道如何获取今天未创建的所有文件的列表。基本上我必须查找文件夹中是否有除今天之外的具有旧时间戳的文件。如果存在,我只需删除旧文件。

答案1

find . -type f -mtime +0 -exec rm -f {} +

或者

find . -type f ! -mtime -1 -exec rm -f {} +

将删除其内容上次修改时间超过 24 小时前的常规文件(-mtime +0意思是:其内容年龄以天为单位(向下舍入为整数,天为 24 小时,或 86400 Unix 纪元秒持续时间)严格大于 0)。

有些find实现有一个-delete谓词,您可以使用它来代替它,-exec rm -f {} +这会使其更安全、更高效。

对于上次修改时间早于今天 00:00:00 的文件,使用 GNU find,您可以添加-daystart谓词。这将包括昨天最后修改的文件,即使是在不到 24 小时之前。

通过一些find实现,您还可以执行以下操作:

find . ! -newermt 00:00:00 -delete

删除最后一次在今天 00:00:00 之前(或恰好)修改的文件。

答案2

使用 zsh,无论是本机还是通过zsh -c "..."

rm -f /path/to/folder/*(.m+0)     # for that directory only

rm -f /path/to/folder/**/*(.m+0)  # recursively

括号(...)创建一个zsh“全局限定符”。在里面,一个点.指定普通文件(类似于 find -type f),并且m+0要求文件的修改时间严格大于 0 天前(截断到整天后) - 23 小时是 0 天; 25小时就是1天。

为了更紧密地匹配find查找/匹配“隐藏”文件(以点开头)的默认行为,请添加大写 D 限定符:

rm -f /path/to/folder/*(D.m+0)     # for that directory only

rm -f /path/to/folder/**/*(D.m+0)  # recursively

答案3

find 有一个参数-notor ,!它否定后面的一个并-delete删除文件:

find . ! -mtime -1 -type f -delete

请注意,-not不符合 POSIX 标准

答案4

当一天的旧文件数量很大时,我会执行以下操作以确保彻底。获取每天的文件数:

$ find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
# Output:
  42315 2020-09-29
  42315 2020-09-30
  42315 2020-10-01
  42315 2020-10-02
  42315 2020-10-03
  42315 2020-10-04
  42315 2020-10-05
   2275 2020-10-06

并删除所有早于当天的文件:

$ find . -mindepth 1 -type f -mtime +0 | xargs /bin/rm -f
## Now to check the count again.
$ find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
   2275 2020-10-06

不知道为什么,但我发现使用-exec rm需要花费很多时间,而管道则xargs更快。

相关内容