Linux

如何刪除兩次之間創建的文件?

  • April 16, 2019

我有一個文件夾,我將我的數據庫備份到其中,並且我想刪除在上午 11 點到下午 3 點之間創建的所有備份,不管它是哪一天——這就是問題所在!

我發現這個命令非常有用,但在我的案例中卻沒有:

find . -type f -newermt '01 nov 2018 00:00:00' -not -newermt '10 nov 2018 00:00:00' -delete

但在這裡它迫使我在兩個日期之間有一個間隔!我只想刪除在兩個特定時間之間創建的備份。

簡單地說,假設你標記了linux,你就有了stat可用的命令,它將提取文件的修改時間,以及 GNUdate命令,它將從給定時間中提取小時:

find . -type f -exec sh -c '
 h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' \
 sh {} \; -ls

如果結果看起來正確,那麼:

find . -type f -exec sh -c '
 h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' \
 sh {} \; -delete

這是該版本的測試執行-ls

$ touch -d 'Wed Sep 12 11:00:01 EDT 2018' 11am
$ touch -d 'Wed Sep 12 12:00:02 EDT 2018' 12pm
$ touch -d 'Wed Sep 12 15:00:03 EDT 2018' 303pm
$ find . -type f -exec sh -c 'h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' sh {} \; -ls
1705096    0 -rw-r--r--   1 user group 0 Sep 12  2018 ./11am
1705097    0 -rw-r--r--   1 user group 0 Sep 12  2018 ./12pm

感謝 Kusalananda 寫了我遵循的出色答案,在:了解 find 的 -exec 選項

請注意,我們想要這裡的{} +版本find,因為我們希望-exec結果是每個文件的,所以我們只刪除與時間範圍匹配的文件。

嵌入式 shell 腳本有兩個主要部分:確定文件的“小時”時間戳,然後根據范圍返回成功或失敗。第一部分本身是分兩部分完成的。變數被賦值為命令替換的結果;該命令應由內而外讀取:

  1. $(stat -c %Y "$1")– 這個(第二個)命令替換呼叫嵌入式 shell 腳本stat$1參數;$1被分配find為它找到的路徑名之一。該stat命令的 %Y 選項以秒為單位返回修改時間。
  2. date -d @ ... +%-H– 這從上述命令替換中獲取 seconds-since-the-epoch 並要求date給我們該時間的 Hours 部分;@語法告訴date我們將 seconds-since-the-epoch 作為輸入格式。使用-日期輸出格式中的選項,我們告訴 GNU 日期不要用任何前導零填充值。這可以防止以後對八進制進行任何誤解。

一旦我們$h分配了 Hour 變數,我們使用 bash 的條件運算符[[來詢問該值是否大於或等於 11 並且嚴格小於 15。

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