2010-12-14 65 views
3

我有一個bash腳本,需要知道目錄中所有gzip文件的字節數。現在,我假設它只是一個沒有子目錄的單一目錄。這是非常誘人的做這樣的事情:統計目錄中所有gzip文件的字節數

du -scb /my/dir/*.gz|tail -n 1

不過,我有文件的TON。 *.gz不會擴展到某種溢出狀態嗎?有沒有更快,更安全的方法來檢查這個數字?

+0

你看起來很好。任何體面的實現都將支持64位文件(我的意思是大於2GB),因此也支持64位總計。 – 2010-12-14 23:47:10

+1

@Chris我認爲他擔心超出命令行長度限制。在大多數Linux系統中,它非常龐大(如果我沒記錯的話,它是128kB),但在一些* nixes中它非常小(我認爲在Solaris上它大概是255字節)。 – 2010-12-14 23:54:28

+0

命令行長度限制是我關心的問題。有沒有辦法從bash中設置和獲取這個值? – User1 2010-12-15 20:12:42

回答

4

這個工程,是 「安全」:

(find . -type f -print0 | 
    xargs -0 stat -c '%s' | 
    tr '\n' '+'; echo 0) | 
    bc 

工作原理:

  • 首先,使用find,找到 '廣州' 的文件。用無分隔符打印它們,所以我們可以處理奇怪的文件名。
  • xargs將把文件名組拆分成可管理的塊。將這些文件名分配給stat -c '%s'以獲取字節大小(謝謝@Fritschy)。
  • tr將換行符轉換爲+。回聲在最後加上一個0加上一個換行符。這是因爲我們不會得到一個懸掛加號,並且bc需要在輸入結尾處換行。
  • 將鉅額款項轉入bc。
+0

不錯的,檢查'統計(1)',它可以根據給定的格式統計文件和打印信息。 – 2010-12-14 23:54:20

+0

@Fritschy:謝謝,我不知道'stat(1)'。納入答案。 – 2010-12-15 00:05:02

1
echo $(($(find . -type f -name '*.gz' -printf '%s+') 0)) 

如果您需要巨大值,改變'%s+''%s+0',改變$((... 0))... | bc

編輯:對於更大的價值,您可能需要使用%k,而不是%s,給你千字節。由於整數可能溢出。

因爲我們只在bash中使用內置函數,所以我不確定可執行文件的參數長度是否有問題。

相關問題