在linux中查找命令並刪除,但用列印測試,沒有結果
我試圖在我的 NAS 上查找一些文件,然後刪除超過 5 天的文件/文件夾。我可以使用 find 命令:
find /volume1/docker/UV/videos -type f -print
然後我從影片文件夾和子目錄中獲取所有文件。
但如果我嘗試:
find /volume1/docker/UV/videos -mtime +2 -print
然後什麼也沒有發生,我知道有超過 2 天的文件,如果我將 2 更改為 1,也會發生同樣的情況。
所以我不能得到一個文件和子目錄的列表,其中有超過 2 天的文件。我不想要的是找到文件/文件夾,然後將 -print 更改為 -delete,但我使用的是 -print,所以我知道結果會是什麼,但是 atm。結果什麼都沒有。
有人可以幫助/指導我嗎?
問題是
-atime
,-ctime
和-mtime
選項做了一些意想不到的捨入。解釋man find
如下-atime
:
-atime *n*
文件最後一次訪問是在n 24 小時前。當*
find
計算出上次訪問該文件的時間是多少 24 小時前,任何小數部分都將被忽略,因此要匹配-atime +1
**,文件必須至少在兩天前被訪問過。在現代版本中有替代方案
find
:
-mmin
(和變體)按分鐘計算,而不是按天計算。所以-mmin "+$(( 60*24*2 ))"
根據 2 天前的目前時間工作。
-daystart
根據當天的 00:00:00 測量時間。這是一個相當生硬的工具,並且對命令行上的選項順序很敏感。如果您在一個沒有這些最新擴展的系統上
find
(例如 Solaris 或 AIX),或者不希望您的所有內務管理都強制執行午夜截止,並且不希望每次執行時都有不同的截止時間,請使用參考文件是一個不錯的選擇。Paul--) touch -t 202009020301 FileToRetain Paul--) touch -t 202009020300 FileOnCusp Paul--) touch -t 202009020259 FileToDelete Paul--) Paul--) touch /tmp/myRefFile -t $( date -d '4 days ago' '+%Y%m%d0300' ) Paul--) ls -ltr /tmp/myRefFile . -rw-r--r-- 1 paul paul 0 Sep 2 03:00 /tmp/myRefFile .: total 0 -rw-r--r-- 1 paul paul 0 Sep 2 02:59 FileToDelete -rw-r--r-- 1 paul paul 0 Sep 2 03:00 FileOnCusp -rw-r--r-- 1 paul paul 0 Sep 2 03:01 FileToRetain Paul--) find . -type f ! -newer /tmp/myRefFile -delete Paul--) ls -ltr /tmp/myRefFile . -rw-r--r-- 1 paul paul 0 Sep 2 03:00 /tmp/myRefFile .: total 0 -rw-r--r-- 1 paul paul 0 Sep 2 03:01 FileToRetain Paul--)
參考文件不應位於被清理的目錄中(它可能會在某個有趣的時刻自行刪除),並且在生產中您可能應該使用
mktemp
或將 PID 作為名稱的一部分以避免並發使用時出現問題,然後再使用rm
它。當然,如果您沒有 modern
find
,那麼您可能也沒有date -d
。我的家務是按月計算的,所以在 Solaris 上必須編寫月/年溢出腳本,而不是月末或閏年——只需設置 dd=01。但是與一周或一個月中的特定日期對齊是其他事情,find
它本身無法乾淨地完成:date -d 'last Sunday 06:00'
作為參考文件很有幫助。