Linux

查找和刪除具有特定日期的文件

  • May 17, 2021

如何刪除在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

您可以使用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

首先,查找在某個時間創建的文件有點困難,因為創建時間通常不會保存在任何地方或者很難獲得。您所擁有的是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至少存在於 GNU find 和 OS X 上的 BSD find 中。)


當然,您實際上可以解析日期的文本表示,但是ls如果某些小丑創建的文件中包含不可列印的字元,則很難正確處理。當然,範例文件沒有任何此類文件,但一般來說,任何人都可以創建它們,尤其是在/tmp.

(儘管| xargs rm您只是錯過了這些文件,並且由於文件名不能包含斜杠,因此任何人都很難將您rm指向另一個目錄。)

引用自:https://unix.stackexchange.com/questions/302011