Linux
如何刪除兩次之間創建的文件?
我有一個文件夾,我將我的數據庫備份到其中,並且我想刪除在上午 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 腳本有兩個主要部分:確定文件的“小時”時間戳,然後根據范圍返回成功或失敗。第一部分本身是分兩部分完成的。變數被賦值為命令替換的結果;該命令應由內而外讀取:
$(stat -c %Y "$1")
– 這個(第二個)命令替換呼叫嵌入式 shell 腳本stat
的$1
參數;$1
被分配find
為它找到的路徑名之一。該stat
命令的 %Y 選項以秒為單位返回修改時間。date -d @ ... +%-H
– 這從上述命令替換中獲取 seconds-since-the-epoch 並要求date
給我們該時間的 Hours 部分;@
語法告訴date
我們將 seconds-since-the-epoch 作為輸入格式。使用-
日期輸出格式中的選項,我們告訴 GNU 日期不要用任何前導零填充值。這可以防止以後對八進制進行任何誤解。一旦我們
$h
分配了 Hour 變數,我們使用 bash 的條件運算符[[
來詢問該值是否大於或等於 11 並且嚴格小於 15。