Mac OS X 無法正確報告目錄大小?

Mac OS X 無法正確報告目錄大小?

在 Finder 中,我注意到如果我複製一些 .app 檔案(在「應用程式」資料夾中),Finder 將顯示重複的 .app 檔案與原始檔案的大小不同。我複製的所有 .app 檔案都不會出現這種檔案大小差異,但 .app 檔案越大,副本顯示的大小與原始檔案的大小就越有可能不同。這裡有些例子:

GarageBand.app - 381.7 MB
GarageBand copy.app - 373.2 MB

iMovie.app - 695.3 MB
iMovie copy.app - 635.4 MB

Install Xcode.app - 1.81 GB
Install Xcode copy.app - 1.57 GB

現在我是 Mac 新手,在註意到這個檔案大小差異問題後,我發現 .app 檔案實際上不是檔案 - 它們實際上是目錄,但 Finder 將它們顯示為檔案一樣。所以我想也許複製過程沒有複製原始 .app 目錄的所有內容,這解釋了「檔案大小」的差異。但後來我下載並安裝了 DeltaWalker,這是一個檔案/資料夾比較工具,DeltaWalker 說重複的 .app 目錄與原始 .app 目錄完全相同。因此,複製過程完美運行,因此 Finder 報告檔案大小似乎有問題。

我還使用“du”命令檢查了終端機中目錄的大小,這也顯示了原始目錄和重複目錄之間的大小差異:

du -k /Applications/GarageBand.app/
212868  /Applications/GarageBand.app/

du -k /Applications/GarageBand\ copy.app/
397880  /Applications/GarageBand copy.app/

du -k /Applications/iMovie.app/
629644  /Applications/iMovie.app/

du -k /Applications/iMovie\ copy.app/
700500  /Applications/iMovie copy.app/

du -k /Applications/Install\ Xcode.app/
1771864 /Applications/Install Xcode.app/

du -k /Applications/Install\ Xcode\ copy.app/
1772228 /Applications/Install Xcode copy.app/

此外,它不僅僅是 .app 目錄。我複製了我的 /Developer/Library 目錄,這是 du 所說的:

du -k /Developer/Library/
320784  /Developer/Library/

du -k /Developer/Library\ copy/
399868  /Developer/Library copy/

那麼誰能解釋一下為什麼 Mac OS X 似乎不能正確報告目錄大小呢?這是一個錯誤(對於如此簡單的事情很難相信),還是我錯過了一些東西(作為一個新的 Mac 用戶)?

(我運行的是 Mac OS X Lion 10.7.2)


針對 elofturtle 的更新:

最奇怪的是 Finder 沒有一致性。我剛剛製作了 GarageBand.app 的 2 個副本,然後對其中一個副本製作了 2 個副本。 Finder 以不同的大小顯示每個重複:

GarageBand.app - 381.7 MB
GarageBand copy.app - 357.6 MB (duplicate of GarageBand.app)
GarageBand copy 2.app - 353.9 MB (duplicate of GarageBand.app)
GarageBand copy 3.app - 378.2 MB (duplicate of GarageBand copy 2.app)
GarageBand copy 4.app - 329.1 MB (duplicate of GarageBand copy 2.app)

另請注意,“GarageBand copy 3.app”大於“GarageBand copy 2.app”,而“GarageBand copy 4.app”小於“GarageBand copy 2.app”。這一定是 Finder 中的一個錯誤。

以下是“du -k”對所有這些內容的描述:

212868  /Applications/GarageBand.app/
397880  /Applications/GarageBand copy.app/
397880  /Applications/GarageBand copy 2.app/
397880  /Applications/GarageBand copy 3.app/
397880  /Applications/GarageBand copy 4.app/

至少它說所有副本的大小相同,但它們與原始大小不同。

答案1

差異來自不同的原因:不同的計數方式、不同的工具、壓縮以及看起來像錯誤的內容。

第一個區別你看到的尺寸似乎是Finder 中的錯誤。 Finder 顯示的檔案大小以某種方式即時計算並快取在.DS_Store檔案中。由於某種原因,在複製大型應用程式/資料夾時,Finder 會在複製過程中計算其大小並快取不完整的大小。然後它在 Finder 視窗中顯示該大小為灰色,灰色表示Finder 知道自上次大小計算以來內容已更改,但尚未重新計算

我發現使其正確重新計算大小的唯一方法是刪除.DS_Store應用程式資料夾中的文件,然後退出 Finder(例如從活動監視器)並再次重新啟動它(從 Dock 圖標)。如果您不刪除該.DS_Store文件,它仍然是灰色。也許在等待某個時間(小時,天,重新啟動,...)將使 Finder 自行完成。

之後,您應該會看到 Finder 報告的所有尺寸都是相同的。

所以,是的,它看起來像是一個 Finder 錯誤,至少在 OSX Lion 中是這樣(這裡使用 10.7.4 進行測試,Finder 版本為 10.7.3)。您還可以看到這個線程報告相同類型的行為。

然後,讓我們考慮一下該du工具。起初,我認為我們看到的差異可以透過複製的項目的邏輯大小和物理大小之間的差異來解釋。邏輯大小是真實的項目的大小,意味著它包含的每一位資訊加在一起。物理大小是磁碟上項目的大小,其中每個資訊位元都寫入磁碟區上。

例如,包含單一字元的檔案最終的邏輯大小為 1 位元組,但實際寫入磁碟時的實體大小為 512 位元組甚至 4096 位元組。物理大小通常大於邏輯大小(並且取決於磁碟或檔案系統的實際磁區/區塊大小)。這是在另一個線程中解釋了更多細節。在以下情況下邏輯大小可能會更大稀疏文件,但是HFS+似乎不支援這樣的功能。

du僅顯示物理大小(並且您可以告訴它 BLOCKSIZE 是什麼)。您可以看到報告的尺寸du總是比原始尺寸更大(或者,在特殊情況下,相同)。這是因為檔案系統和磁碟空間碎片。當您複製文件(實際上這裡是一堆文件,因為應用程式是一個目錄)時,將在磁碟上分配新扇區,並且,當碎片發生時,使用的區塊數通常高於原始項目的區塊數。有些人稱之為文件鬆弛

現在,回到 Finder。如果你打開獲取資訊在您複製的應用程式視窗中,您將看到 Finder 實際上報告了您所選項目的邏輯和物理大小。這是有道理的。du如果您進行一些數學計算,您甚至可以將 Finder 報告的物理尺寸與 Finder 報告的物理尺寸進行比較。

為什麼要做一些數學?因為 Finder 以 kB、MB 或 GB 為單位顯示檔案大小,而du以 kiB、MiB 或 GiB 為單位報告檔案大小。這些是IEC 二進位前綴它應用於計算和顯示數字資訊的單位。

但實際上,我不確定這裡是否涉及 File Slack,還有其他東西。 HFS+ 磁碟區允許壓縮,透明地完成,Apple 將其用於作業系統安裝的原始專案。然後,當使用標準工具複製檔案時,不再使用壓縮(預設情況下,是為了向後相容)。如果要對這些檔案保持壓縮,則需要使用該ditto命令而不是cp任何 Finder 操作。這是這篇評論中解釋了

以下是使用不同技術複製 iTunes.app 的輸出。您將看到,同上使應用程式具有完全相同的大小,保留壓縮,而cp沒有。您甚至可以刪除不需要的拱門的二進位文件,然後減小整個大小):

antoine@amarante:/Applications$ du -ms iTunes.app/
281 iTunes.app/
antoine@amarante:/Applications$ cp -a iTunes.app/ iTunes-copy.app/
antoine@amarante:/Applications$ ditto iTunes.app/ iTunes-ditto.app
antoine@amarante:/Applications$ ditto --arch x86_64 iTunes.app/ iTunes-64.app
antoine@amarante:/Applications$ du -ms iTunes*
236 iTunes-64.app
289 iTunes-copy.app
281 iTunes-ditto.app
281 iTunes.app

感謝@DanPritts 的回答在我的補充貼文上

答案2

這是 OS X 中的一個可怕的缺陷/錯誤。空間不會恢復。文件還是很大。例如,如果您有一個 3.5GB 的應用程式包,您顯示內容,然後從中刪除 3GB,您現在應該有一個檔案大小為 500MB 的應用程式。你不會。仍然是 3.5GB。

答案3

這基本上是一個猜測,但我看到兩種可能性:

  1. 某些資料已被刪除,但在原始資料中並未釋放,並且不會被複製過來。然而,它會出現在一些磁碟使用情況搜尋中,但不會顯示在其他磁碟使用情況搜尋中(給 du 或 OS X 內部使用的任何參數提供不同的參數)。
  2. 有些資料會連結到原始位置,這會影響不同工具中的感知大小。

如果 (1) 您可能會得到不同的結果,製作第三個副本並比較副本。

答案4

在 SSD 上安裝 Yosemite 後,將主目錄移至內部 HDD 後,我的主目錄出現了這個問題。當使用「獲取資訊」時,儘管 Finder 的狀態列中顯示正確的大小為 240GB,但它報告的錯誤大小僅為 8GB。我透過點擊「使用者」資料夾上的「取得資訊」來修復此問題,然後正確計算並修復主目錄報告的不正確大小。

相關內容