查找并删除具有特定日期的文件

查找并删除具有特定日期的文件

如何删除以 下面的Aug 7名称创建的文件DBG_A_sql*/tmp

如下例:

-rw-r--r-- 1 root    root   51091 Aug  7 11:22 DBG_A_sql.2135
-rw-r--r-- 1 root    root   15283 Aug  7 11:22 DBG_A_sql.2373
-rw-r--r-- 1 root    root   51091 Aug  7 11:22 DBG_A_sql.2278
-rw-r--r-- 1 root    root    9103 Aug  7 11:22 DBG_A_sql.2485
-rw-r--r-- 1 root    root    9116 Aug  7 11:22 DBG_A_sql.2573
-rw-r--r-- 1 root    root    9140 Aug  7 11:22 DBG_A_sql.2679
-rw-r--r-- 1 root    root   15695 Aug  7 11:22 DBG_A_sql.2897

答案1

您可以使用find。根据您的要求和用途计算日期,

find /tmp -maxdepth 1 -mtime -1 -type f -name "DBG_A_sql*" -print

确认后删除它们,

find /tmp -maxdepth 1 -mtime -1 -type f -name "DBG_A_sql*" -delete

答案2

首先,查找文件已创建在某个特定时间有点困难,因为创建时间通常不会保存在任何地方或者很难获取。您所拥有的是mtime,或最后修改时间,ctime这是“更改”时间,根据对 inode 的任何更改进行更新。我假设你想要修改时间。


查找在给定日期修改的文件有点有趣,因为find似乎很难正确处理在午夜创建的文件。

如果我们知道相对时间(即昨天),我们可以使用 find -daystart -mtime 1,但它会发现文件在错误的午夜修改,Aug 8 00:00。然而,这似乎有效:

find dir/ -daystart -mtime +0 \! -mtime +1 -ls

如果不想计算相对时间,并且您find-newerXY

find dir/ -newermt 'Aug 7 00:00' \! -newermt 'Aug 8 00:00' -ls

同样,这会导致在午夜创建的文件错误,因为比较是“较新”,而不是“较新或一样旧”。虽然如果您的系统具有亚秒精度的时间戳,则可能很难达到这一点,但如果您使用touch...创建的文件进行测试,则会发生这种情况。

一个棘手的解决方法是这样的:

find dir/ -newermt 'Aug 6 23:59:59.999999999' \! -newermt 'Aug 7 23:59:59.999999999' -ls

无论如何,添加必要的-name "DBG_A_sql*"内容以仅获取具有正确名称的文件。您可以将-ls末尾的 替换为-delete来删除文件而不是列出文件。 (-ls-delete并且-newerXY至少存在于 OS X 上的 GNU find 和 BSD find 中。)


当然,您实际上可以解析日期的文本表示形式,但ls如果某些小丑创建的文件中包含不可打印的字符,则很难正确解析。当然,示例文件没有任何此类文件,但一般来说,任何人都可以创建它们,尤其是在/tmp.

(尽管| xargs rm您会错过这些文件,并且由于文件名不能包含斜杠,所以任何人都很难将您指向rm另一个目录。)

答案3

只是 bash 循环

for file in /tmp/DBG_A_sql* ; do
    [ "$(date -I -r "$file")" == "2016-08-07" ] && rm "$file"
done

答案4

假设通过已创建, 你的意思是上一次更改(这是 报告的时间ls -l),其中zsh

autoload age # best in ~/.zshrc
rm /tmp/DBG_A_sql*(e:age 2016-08-07:)

相关内容