
作為磁碟清理的一部分,我現在需要刪除過去 3 天(不是當前營業日期)創建的所有資料夾及其內容:
例 - 今天的日期是 20191121,那麼:
/opt/png/wsm/data/workdir/batch/*20191120*
/opt/png/wsm/data/workdir/batch/*20191119*
/opt/png/wsm/data/workdir/batch/*20191118*
我現在能做的就是獲取清單:
ls -d */ | grep 20191118 (and then 19 and 20)
如何檢查刪除特定日期的資料夾及其內容可以節省多少大小?
伺服器上的 bash 版本是:
bash-3.2$ bash --version
GNU bash, version 3.2.57(1)-release (i386-pc-solaris2.10)
Copyright (C) 2007 Free Software Foundation, Inc.
答案1
清理檔案和資料夾時,您可能需要使用該du
命令。
du
列出驅動器空間使用情況,有一個--time
選擇,並且可以使用僅適用於目錄。結合它們:
du -h */ --time | grep -E '2019\-09\-(18|19|20)'
這將獲取其內容最後在 11 月 18 日、19 日或 20 日創建或修改的任何子目錄。它將輸出大小(-h
人類可讀)、修改日期,最後是路徑。
答案2
如果您嘗試 rm 的目錄包含超過 5000 個文件,則先前的答案將失敗。這將為您留下未刪除的舊目錄。
使用 find 代替“-exec rm {} \+”,這將調用 rm 一次或多次,每次調用最多 5000 個參數。
為了尋找已修改的檔案/目錄,請使用 find
find . -type d -atime n # for exact number of days
find . -type d -atime +n # for greater than n days
您可以新增 -daystart 選項來測量從今天開始而不是 24 小時前的時間
然後,使用“-exec rm {} \+”刪除或使用“-exec du -sh {} \;”取得每個目錄的磁碟使用情況。
也要考慮 find + du 呼叫的 -maxdepth 選項,以將查找限制為頂層目錄。
請參閱“man find”以獲取更多資訊(從終端(最好)或從 man7.org 獲取最新的手冊頁:http://man7.org/linux/man-pages/man1/find.1.html,但不是來自 Die.net(他們甚至去掉了頁面時間戳,所以你不知道他們的手冊頁或年齡和過時的))。
答案3
然後為 @Kusalananda 解決方案提供更短且(從我的角度來看)更易讀的語法,並使用日期而不是 gdate (儘管也許 gdate 是Solaris上的等效日期?):
days=$(echo -e "1 day ago \n 2 days ago \n 3 days ago" | date -f - +'%Y%m%d')
dpath="/opt/png/wsm/data/workdir/batch"
for day in $days ; do
du -s -h "$dpath/$day"
rm -r -f "$dpath/$day"
done
答案4
如果您的 Solaris 系統有bash
,那麼它通常也會有 zsh。
由於該日期格式恰好像數字一樣排序,因此您可以使用 zsh 的<start-end>
十進制數字範圍全域運算符:
zsh -c '
zmodload zsh/datetime
now=$EPOCHSECONDS day=$(( 24 * 60 * 60 ))
for var t (start $(( now - 3*day )) end $(( now - 1*day )) )
strftime -s $var %Y%m%d $t
range="<$start-$end>"
rm -rf -- *$~range*(/)
'
請注意,如果在夏令時切換時在半夜運行,則從當前時間減去 24*60*60 秒可能會導致您在同一天或 2 天前運行。
若要取得c
這些目錄的累計磁碟使用情況,請替換rm -rf
為du -c
.這是否是刪除它們後將回收的空間量取決於這些目錄中的任何文件是否在其他地方有硬連結。