如何删除以 下面的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:)