使用 +mtime , +mmin 選項時出現奇怪的行為“查找命令”
我有一台生產伺服器。在那我有一個特定對象的目錄,它會在從不同的網路節點收集文件後繼續堆積文件。因此,它的子目錄中包含 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 {} +
不要使用
xargs
which 不能處理find
(除了 withfind -print0 | xargs -r0...
)的輸出。儘管如此
xargs
,find -exec cmd {} +
可能會執行多個 的實例cmd
,這將導致在輸出時產生幾批獨立排序的文件。為避免這種情況,您可以使用
zsh
並執行以下操作:autoload zargs zargs -- ./**/*(D.m+1Om) -- ls -Uld
或者使用 GNU
xargs
進行拆分:print -rNC1 -- **/*(ND.m+1Om) | xargs -r0 ls -Uld --
(
-U
作為不排序的 GNUls
擴展(不必要,因為已經對它們進行了排序)。您可以用其他實現zsh
替換)。-rt``ls
您總是可以嘗試完全不拆分,但可能會遇到長度限製或可以傳遞給命令的參數+環境,並看到參數列表太長錯誤:
ls -lrtd -- **/*(D.m+1oN)
如果您無法安裝 zsh,使用 、 、 和實用程序的 GNU 實現
find
(sort
在sed
RHEL7xargs
上ls
找到),您可以執行以下操作: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