我想要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 有一个参数-not
or ,!
它否定后面的一个并-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
更快。