Linux

使用 +mtime , +mmin 選項時出現奇怪的行為“查找命令”

  • March 19, 2022

我有一台生產伺服器。在那我有一個特定對象的目錄,它會在從不同的網路節點收集文件後繼續堆積文件。因此,它的子目錄中包含 May-2021 的文件。它通常每小時創建一天的子目錄並將文件推送到這些子目錄中。子目錄結構 -

在此處輸入圖像描述

我使用以下命令find . -type f -mtime +2 | xargs ls -ltr 列出了 2 天前的文件以將其刪除。

但是當我執行命令進行檢查時,我發現它們以意想不到的方式排序。

在此處輸入圖像描述

正如您在上面看到的,理想情況下它應該縮短 10-03 文件然後 11-03 ,但它的做法完全相反。另一件事是它還列出了當天的文件(18-03)。那麼有人可以給它遮光嗎?

請注意,目錄大小為 11G 。而且文件通常每分鐘都在堆積,那麼它對此有什麼影響嗎?

Distro - Red Hat Enterprise Linux Server 7.6 版 (Maipo)

find . -ctime +2報告上次更改狀態時間為 3 天或更早的文件(其中開始時間與文件的 ctime 之間的差異find,向下舍入到整數天數嚴格大於 2)。

ctime您可以列印的, 可以ls -lc在任何關於文件的任何內容被修改時更新(除非它只是它的訪問時間):當它在任何目錄中的條目被重命名時,當它(取消)連結(從)到新目錄時,當其內容或權限或其他元數據發生變化時……

ls -l預設顯示並按預設ls -t排序的時間戳是最後修改時間。僅在修改內容時才更新該內容(儘管也可以像touch命令一樣任意設置)。那可以看成是文件內容的創建時間

除了這些和最後訪問時間之外,在某些系統上,還有一個出生時間,也就是創建時間,儘管它通常不如最後修改時間有用。對於最新版本的 GNU ls(不在您的 RHEL7 系統上),它可以用ls -l --time=birth或顯示ls -l --time=creation

要查找 2 天前最後修改的正常文件,並將它們傳遞給ls它以便從最舊到最新列出它們,您可以:

find . -type f -mtime +1 -exec ls -lrtd {} +

不要使用xargswhich 不能處理find(除了 with find -print0 | xargs -r0...)的輸出。

儘管如此xargsfind -exec cmd {} +可能會執行多個 的實例cmd,這將導致在輸出時產生幾批獨立排序的文件。

為避免這種情況,您可以使用zsh並執行以下操作:

autoload zargs
zargs -- ./**/*(D.m+1Om) -- ls -Uld

或者使用 GNUxargs進行拆分:

print -rNC1 -- **/*(ND.m+1Om) | xargs -r0 ls -Uld --

-U作為不排序的 GNUls擴展(不必要,因為已經對它們進行了排序)。您可以用其他實現zsh替換)。-rt``ls

您總是可以嘗試完全不拆分,但可能會遇到長度限製或可以傳遞給命令的參數+環境,並看到參數列表太長錯誤:

ls -lrtd -- **/*(D.m+1oN)

如果您無法安裝 zsh,使用 、 、 和實用程序的 GNU 實現findsortsedRHEL7xargsls找到),您可以執行以下操作:

find . -type f -mtime +1 -printf '%T@:%p\0' |
 LC_ALL=C sort -zn |
 LC_ALL=C sed -z 's/^[^:]*://' |
 xargs -r0 ls -Uld

我們通過 mtime 手動對文件進行排序,方法是將其find列印為數字%T@,使用sort -n對其進行排序,sed刪除它並將xargs列表傳遞給ls所需的盡可能多的呼叫,每個呼叫都被告知不要打擾排序-U。全部使用 NUL 分隔的記錄完成,因此它可以使用任意文件路徑。

無論如何,要使用 GNU 刪除這些文件,find您只需要使用它的-delete謂詞:

find . -type f -mtime +1 -delete

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