遞歸刪除特定目錄名稱下超過 2 天的所有文件
我寫了這個腳本:
#!/bin/bash DAYSOLD="2" users_dir="/users" cd $users_dir date >> cleanup.log; du -h --max-depth=1 | sort -hr >> cleanup.log find $users_dir -mtime +$DAYSOLD -type f -exec rm -v {} \;
我只想刪除“工作區”目錄下且超過 2 天的文件。這應該怎麼做?
/users/user1/workspace /users/user2/workspace /users/user3/workspace
感謝您的幫助。我很想學習如何做到這一點。
-mtime "+$days"
選擇年齡(基於上次修改時間)向下舍入到整數天數嚴格大於$days
.不會選擇 2 天 23 小時前的文件,
-mtime +2
因為它被認為是 2 天前的文件,不大於2
.所以你需要:
find "$users_dir"/*/workspace -mtime "+$(( DAYSOLD - 1 ))" -type f -delete
要刪除
$DAYSOLD
在workspace
.$users_dir
雖然你也可以這樣做:find "$users_dir"/*/workspace '(' -mtime "$DAYSOLD" -o -mtime "+$DAYSOLD" ')' \ -type f -delete
刪除年齡(整數天數)為
$DAYSOLD
或大於$DAYSOLD
.
-delete
是一個非標準擴展,但在 GNU 中可用,find
就像在 Ubuntu 上一樣,並且比使用-exec rm
.-delete -print
如果您想要已成功刪除的文件列表,您可以創建它。還記得在攜帶變數之前引用你的變數並檢查退出狀態
cd
:(cd -P -- "$users_dir" && exec du...)
否則du
如果cd
失敗會在錯誤的目錄中執行。$users_dir
另請注意子shell 的使用,否則如果是相對路徑,它將無法正常工作。把它寫成這樣實際上更有意義:cd -P -- "$users_dir" || exit du ... find . ...
$users_dir
(如果是符號連結會更一致)¹ 嚴格來說,這至少是
$DAYSOLD
幾天前的事情,但考慮到比較是使用納秒精度完成的,並且需要幾百納秒才能開始find
,這種區別幾乎無關緊要。² 嚴格來說,如果
workspace
是一個非directory類型的文件,它仍然會被傳遞給find
,並且如果該文件早於$DAYSOLD
幾天(並且是 的正常文件-type f
),它也會被刪除。您可以切換到zsh
並添加(/)
到模式以確保僅workspace
考慮目錄類型的文件。不要像/
在下面遇到 ³ 那樣附加更嚴重的後果(例如何時/users/joe/workspace
是/bin
或的符號連結/
)。³ 請注意,那裡遵循符號連結。因此,如果
/users/joe
是一個符號連結/
,例如,它將刪除目錄中的舊文件/workspace
。