我有一個有點奇怪的問題,在一個有數百名用戶的服務器上有一個共享存盤。我想識別所有不能被我的用戶洗掉的檔案(如果我試圖運行一個自動洗掉腳本)。
對于所有這些被識別的檔案,我需要長串列格式(即:完整路徑、所有者、最后修改、大小)。我目前的理解是,這將是所有其直接父目錄不可被我寫入的檔案,如果這種方法是錯誤的,請糾正我。
在確定這些檔案后,我還需要獲得它們所占用的總大小。雖然,這一步也可以通過使用一個簡單的python腳本來完成,也可以添加所有的大小,但我仍在尋找是否有更好的方法來完成它。
這是我目前的方法:
find /downloads/ -type d ! -可寫 -print0 |
xargs -0 -I{.} find {.} -maxdepth 1 -type f -print0 | |
xargs -0 -I{.} ls -l {.} > myfile.txt
- 找到所有不能被我的用戶寫入的目錄(遞回) 。
- 找到這些目錄的所有直屬子目錄,并只過濾掉檔案 。
- 為每個被識別的檔案獲取一個長串列,并將結果存盤在一個 .txt 檔案中 。
- 用python讀取這個.txt檔案,將所有單獨的大小(以位元組為單位)相加,得到總大小。除以(1024*1024*1024),得到以GB為單位的大小。(python腳本如下:)
with open("myfile.txt"/span>, "r"/span>) as f:
total_size=0
for line in f:
try:
data = line.split()
if len(data) > 5:
total_size = int(data[4]) # "4 "是大小列的索引。
except:
pass。
print("總大小。 ", str(round(total_size/(1024*1024) 。2)), "GB"/span>)
我在這個方法上面臨的問題是,我得到的最終大小是整個卷的總大小。
我的答案=1400.02GB(按照上面的步驟報告)
。
。 整個共享空間的總大小 = 1400.02GB
共享服務器上的實際占用空間 = 800GB
<800GB
所以你看到的問題是,我的答案等于整個服務器空間的總大小,包括甚至沒有被占用的空間。
因此,我的答案等于整個服務器空間的總大小。
我的答案(1400.02GB)和預期的答案(<800GB)之間的這種不匹配,也讓我懷疑已經確定的檔案的正確性。
是否有人能建議一個更好的方法,或者指出我的方法中的問題,以便我能夠解決它。非常感謝。
uj5u.com熱心網友回復:
這里有兩個原因,為什么僅僅加入由ls報告的位元組來計算磁盤使用量必須被認為是天真的:
- 你在重復計算。
- 你在重復計算硬鏈接的檔案,盡管硬鏈接只是一個目錄條目,基本上不占用額外的磁盤空間。
- 如果你想找出實際的磁盤使用量("獲得它們所占用的總大小"),你必須考慮塊的大小。例如,一個有1000個1位元組檔案的目錄可能比一個有1MB檔案的目錄占用更多的空間
因此,適合這項作業的工具是du。但是為了使du能夠正確地完成他的作業,并且不重復計算硬鏈接,你必須讓它一次檢查所有的檔案。幸運的是,GNU版的du有--files0-from選項,例如,你可以使用
find . -type d ! -可寫的 -print0 |
du -ch -d 1 --files0-from=- !
tail -n 1
這也避免了xargs,由于-I選項意味著你要為每個引數進行find呼叫,所以速度會非常慢。
uj5u.com熱心網友回復:
我不確定為什么你的命令給出了這樣一個錯誤的數字,但這里是另一個你可以嘗試的命令。
注意,由于檔案系統塊、硬鏈接和稀疏檔案等原因,"它們占用的總大小"可能與ls所列印的大小之和有很大的不同。所以我們使用du而不是ls來獲得大小。
下面的命令基本上是LMC的評論,但將ls納入同一搜索,并使用-exec 而不是xargs -I,這應該大大加快了命令的速度,因為你只運行第二次find,而不是為每個目錄運行一次。
#! /bin/bash
longlist() {
ls -l "$@"/span> >> "$longlistfile"/span>。
}
filesonly(){
找到 "$@" -maxdepth 1 -type f -exec bash -c 'longlist "$@"'/span> . {} -print0
}
export -f longlist filesonly
export longlistfile=myfile.txt
rm -f "$longlistfile"/span>。
查找. -type d ! -可寫 -exec bash -c 'filesonly "$@"' . {}. |
du -ch -files0-from=- | tail -n1
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/308106.html
標籤:
上一篇:TerraformAutoScaling組模塊用戶資料。無法傳遞帶有變數的shell腳本
下一篇:每周一個linux命令(ls)
