我正在尝试编写一个脚本来查找 2014 年 9 月 24 日之前的文件并删除它们。我该怎么做?
答案1
创建一个虚拟文件,时间设置为 2014 年 9 月 24 日 00:00h,然后找到任何不更新的内容并删除:
#date format YYYYMMDDhhmm
touch -t 201409240000 dateref
find -type f ! -newer dateref -delete
find
在使用该选项之前,请先熟悉一下-delete
。请注意,它必须位于最后一个位置,并且可能无需事先检查结果-delete
。
答案2
您可以将find
s -newer
选项与(具有该日期的参考文件)一起使用,以!
否定 -newer。您可以用来touch -d
创建参考文件。例如:
touch -d "2014-09-23 23:59:59.999999999" /tmp/reference-file
find /path/to/directory/ ! -newer /tmp/reference-file -ls
您可能希望将其通过管道传输到less
或重定向到文件以进行检查。
在您确认它只会删除您想要删除的文件后,将选项更改-ls
为。-delete
(如果您不介意同时删除在 2014 年 9 月 14 日午夜创建的文件,则可以使用touch -d 2014-09-24
- 因为它! -newer
不仅意味着“早于”,还意味着“早于或等于”。 .999999999 对于大多数用途来说可能“足够好”)
注意:上面假设 和 都是 GNUfind
版本touch
。可能会或可能不会与其他版本一起使用。如果您使用 Linux,GNU utils 是标准的(除非您使用一些使用busybox
或类似的小型发行版来节省空间)。
从man find
:
-newer reference
当前文件的最后一次数据修改时间比参考文件的最后一次数据修改时间更近。如果引用是符号链接并且
-H
选项或-L
选项有效,则始终使用它指向的文件的最后一次数据修改的时间。
-anewer
如果您想使用访问时间而不是修改时间,另请参见同一手册页。
这些-newerXY
选项也是相关的:
-较新的XY参考
如果所考虑的文件的时间戳 X 比文件引用的时间戳 Y 新,则成功。字母 X 和 Y 可以是以下任意字母:
a The access time of the file reference B The birth time of the file reference c The inode status change time of reference m The modification time of the file reference t reference is interpreted directly as a time
有些组合是无效的;例如, to
X
be是无效的t
。某些组合并非在所有系统上都实现;例如,B
并非所有系统都支持。如果指定了无效或不受支持的组合XY
,则会导致致命错误。时间规范被解释为
-d
GNU 选项的参数date
。如果您尝试使用参考文件的出生时间,但无法确定出生时间,则会出现致命错误消息。
如果您指定一个涉及正在检查的文件的生成时间的测试,则对于生成时间未知的任何文件,此测试将失败。
答案3
试试这个脚本:
#!/bin/bash
d2=$(date +%s)
d1=$(date -d "2014-09-24" +%s)
d=$(( (d2 - d1) / 86400 ))
find ./ -mtime +$d -delete
首先,尝试一下-delete
以确保找到正确的文件。当您 100% 确定时添加-delete
.并使用您想要的路径而不是./
在查找中。