我不需要使用循環,只需謹慎地應用stat和awk。下面的細節和解釋,首先是代碼:
find /PATH/TO/FILES -name '*.tar' -type f \
| sed 's/ /\\ /g' \
| xargs stat -f "%a::%z::%N" \
| sort -r \
| awk '
BEGIN{curSize=0; FS="::"}
{curSize += $2}
curSize > $X_SIZE{print $3}
'
| sed 's/ /\\ /g' \
| xargs rm
請注意,這是一個邏輯命令行,但爲了理智,我將它分開。
它以基於上述命令的find命令開始,沒有將其限制爲超過3天的文件的部分。它將它管理爲sed,以便在文件名稱查找返回中轉義任何空格,然後使用xargs在所有結果上運行統計信息。 -f「%a ::%z ::%N」告訴stat要使用的格式,第一個字段中上次訪問的時間,第二個中文件的大小以及第二個文件中的文件名第三。我用'::'來分隔字段,因爲用這種方式處理文件名中的空格更容易。排序然後將它們排序在第一個字段上,用-r來顛倒排序。
現在我們列出了我們感興趣的所有文件,從最新訪問到最早訪問的順序。然後,awk腳本在列表中加入所有大小,並在超過$ X_SIZE時開始輸出它們。不以這種方式輸出的文件將保留,其他文件名將再次轉到sed以轉義任何空格,然後轉換爲運行rm的xargs。
我認爲這個腳本是一個好的開始,但它並沒有真正回答這個問題。您詢問如何刪除文件,以便目錄大小低於閾值。您的答案似乎並未真正刪除任何內容,只是對文件進行排序並循環播放。看起來你在這裏丟失了一個「rm」。 – 2015-07-17 23:34:08