2014-02-24 45 views
16

我想運行一個find命令,該命令將查找某個文件列表,然後遍歷該文件列表以運行某些操作。我也想找到列表中所有文件的總大小。在UNIX中獲取文件列表的總大小

我想先製作文件列表,然後做其他操作。有沒有簡單的方法可以報告列表中所有文件的總大小?

從本質上說,我試圖找到一個班輪在下面的代碼片段「TOTAL_SIZE」變量:

#!/bin/bash 
loc_to_look='/foo/bar/location' 

file_list=$(find $loc_to_look -type f -name "*.dat" -size +100M) 

total_size=??? 

echo 'total size of all files is: '$total_size 

for file in $file_list; do 
     # do a bunch of operations 
done 
+1

你可以用'printf的 「%P%S \ n」'在'find'命令顯示名稱+大小。 – fedorqui

+0

@fedorqui如果她的'find'版本支持'-printf'。某種形式的'-exec stat -f'%z'{} \;'(取決於你係統對'stat'的實現)也可以。 – chepner

+0

@fedorqui:在for循環之前,您還必須分割文件名和大小...... – sanmiguel

回答

25

您應該簡單地能夠通過$file_listdu

du -ch $file_list | tail -1 | cut -f 1 

du選項:

  • -c d顯示總數
  • -h人類可讀的(即, 17M)

du將打印每個文件中的條目,其次是共(伴-c),所以我們使用tail -1修剪到只有最後一行cut -f 1該行修剪僅第一列。

+0

謝謝@sanmiguel!我把這個命令反引號給了變量:D – HotDogCannon

+0

啊,是的,這可能也有幫助... – sanmiguel

+1

這是一個很好的答案,但請記住'du'打印的實際磁盤使用量取四捨五入(通常是4) KB而不是邏輯文件大小。 '爲我在{0..9};做echo -n $ i> $ i.txt;完成; du -ch * .txt' =>總共40K,而不是總共10個。 – nodakai

1

此代碼對所有文件的信賴LS加起來的所有字節(它排除所有目錄......顯然他們8KB每個文件夾/目錄)

cd /; find -type f -exec ls -s \; | awk '{sum+=$1;} END {print sum/1000;}' 

注: EXECUTE AS根。結果以兆字節爲單位。

11

這裏解釋的方法有隱藏的bug。當文件列表很長時,它超出了shell命令大小的限制。更好地利用這一個使用DU:

find <some_directories> <filters> -print0 | du <options> --files0-from=- --total -s|tail -1 

發現產生空端文件列表中,都需要從標準輸入和計數。 這與shell命令大小限制無關。 當然,您可以添加一些開關來獲取邏輯文件大小,因爲默認情況下,du會告訴您空間文件的物理空間大小。

但我認爲這不是程序員的問題,但對於Unix管理員:)然後爲stackoverflow這是沒有主題。

+2

這是迄今爲止最好的答案。不需要awk或shell變量。 – EMiller

0

ls -l | tr -s''|切-d''-f是我用了很多東西。

第五個字段是大小。將該命令放入for循環並將大小添加到累加器,您將獲得目錄中所有文件的總大小。更容易學習AWK。另外,在命令替換部分,你可以通過grep來限制你要查找的內容(^ - 用於文件等等)。

總= 0

在$大小(LS -l | TR -s '' |切-d '' -f 5); do total = $(($ {total} + $ {size}));做

回聲$ {}總

+0

答案可能正確,但爲了讓別人理解,請添加一些文字以很好的方式描述。 –