解決 macOS 壓縮檔案中的 __MACOSX 和 .DS_Store 檔案問題

當好意變成困擾

想像這樣一個場景:你是一名 Mac 用戶,剛完成了一個重要的專案,需要將檔案打包傳送給使用 Windows 的客戶。你很自然地右鍵點擊資料夾,選擇「壓縮」,然後將產生的 zip 檔案透過 email 寄出。

幾個小時後,你收到客戶略帶困惑的回覆:「為什麼解壓縮後有這麼多奇怪的資料夾和檔案?每個目錄都多了一個叫 __MACOSX 的資料夾,還有一堆 .DS_Store 檔案散佈在各處,這些是什麼?」

這種情況是否似曾相識?身為 Mac 用戶,你可能已經遇過無數次這樣的窘境。這些額外的檔案不僅讓接收者感到困惑,有時甚至會影響檔案的正常使用,特別是在跨平台協作的環境中。

為什麼 macOS 會產生這些檔案?

要理解這個問題,我們需要了解 macOS 檔案系統的運作方式:

__MACOSX 資料夾的由來

__MACOSX 資料夾是 macOS 特有的機制,用來儲存 Mac 檔案系統的擴充屬性(extended attributes)。這些屬性包括: – 檔案的資源分支(Resource Fork) – Finder 標籤和顏色 – 檔案的自訂圖示 – 其他 macOS 特有的中繼資料

當你在 Mac 上建立壓縮檔時,系統會自動將這些擴充屬性打包到 __MACOSX 資料夾中,以確保在其他 Mac 上解壓縮時能完整還原檔案的所有資訊。

.DS_Store 檔案的作用

.DS_Store(Desktop Services Store)是 Finder 自動建立的隱藏檔案,用來記錄資料夾的顯示設定,包括: – 檔案圖示的排列方式 – 視窗大小和位置 – 檔案的排序方式 – 背景圖片設定

雖然這些檔案對 Mac 用戶來說很有用,但對其他作業系統的使用者而言,它們只是無用的垃圾檔案。

解決方案:使用 zip 指令清理壓縮檔

幸運的是,我們可以使用 macOS 內建的 zip 指令來移除這些不必要的檔案。以下是基本的清理指令:

zip -d *.zip __MACOSX/\* ; zip -d *.zip "*.DS_Store"

讓我們詳細解析這個指令:

zip 指令說明

zip 是 Unix 系統中用來建立和修改 ZIP 壓縮檔的標準工具。它提供了豐富的參數選項來控制壓縮行為。

-d 參數的功能

-d 參數代表 “delete”,用來從現有的 ZIP 檔案中刪除指定的檔案或目錄。語法格式為:

zip -d archive.zip pattern

指令解析

  • zip -d *.zip __MACOSX/\*:
    • *.zip 表示對當前目錄下所有的 .zip 檔案執行操作
    • __MACOSX/\* 表示刪除所有 __MACOSX 資料夾及其內容
    • 反斜線 \ 用來跳脫星號,避免被 shell 解釋
  • ; 是指令分隔符,用來在同一行執行多個指令
  • zip -d *.zip "*.DS_Store":
    • 刪除所有的 .DS_Store 檔案
    • 使用引號包圍通配符,確保正確解析

詳細教學:使用終端機執行清理指令

現在讓我們一步一步學習如何在終端機中執行這個指令:

步驟 1:開啟終端機

  1. 按 Command + Space 開啟 Spotlight 搜尋
  2. 輸入「終端機」或「Terminal」
  3. 按 Enter 開啟應用程式

步驟 2:導航到壓縮檔所在的資料夾

這裡我們使用一個非常實用的技巧:拖曳 Finder 路徑

  1. 在終端機中輸入 cd(注意 cd 後面有一個空格)
  2. 開啟 Finder,導航到包含壓縮檔的資料夾
  3. 將該資料夾直接拖曳到終端機視窗中
  4. 你會看到完整的路徑自動出現在 cd 後面
  5. 按 Enter 執行

例如,如果你的壓縮檔在桌面的「專案檔案」資料夾中,拖曳後會看到類似這樣的指令:

cd /Users/你的使用者名稱/Desktop/專案檔案

步驟 3:執行清理指令

確認已經在正確的目錄後,輸入清理指令:

zip -d *.zip __MACOSX/\* ; zip -d *.zip "*.DS_Store"

按 Enter 執行,你會看到類似以下的輸出:

deleting: __MACOSX/
deleting: __MACOSX/._某個檔案
deleting: .DS_Store

這表示清理作業已成功完成。

批量清理:處理多個壓縮檔

上述指令雖然有效,但只能處理當前目錄下的壓縮檔。如果你有很多壓縮檔需要清理,可以使用以下更進階的指令:

for f in *.zip; do zip -d "$f" "__MACOSX/*" "*.DS_Store"; done

for 迴圈指令詳解

這個指令使用了 bash 的 for 迴圈語法:

  • for f in *.zip:遍歷當前目錄下所有的 .zip 檔案,將每個檔案名稱依次賦值給變數 f
  • do ... done:定義迴圈要執行的動作
  • zip -d "$f" "__MACOSX/*" "*.DS_Store":
    • "$f" 表示當前處理的檔案名稱(加引號防止檔名中的空格造成問題)
    • 對每個檔案分別執行刪除 __MACOSX 和 .DS_Store 的操作

指令運作流程

  1. 系統找到第一個 .zip 檔案,將檔名存入變數 f
  2. 執行 zip -d 指令清理該檔案
  3. 繼續處理下一個 .zip 檔案
  4. 重複直到所有 .zip 檔案都處理完畢

這個方法的優點是可以一次性處理整個目錄中的所有壓縮檔,無需手動逐一處理。

簡化操作:建立 alias 別名

每次都要輸入這麼長的指令確實很麻煩,也不容易記憶。我們可以透過建立 alias(別名)來簡化這個過程。

.zshrc 檔案的作用

.zshrc 是 Zsh shell(macOS Monterey 以後的預設 shell)的設定檔,位於你的家目錄中。這個檔案的作用包括:

  • 定義環境變數
  • 設定 shell 的行為和外觀
  • 建立 alias 別名
  • 載入自訂函數和腳本

每當你開啟新的終端機視窗時,系統會自動讀取並執行 .zshrc 中的設定。

alias 的功能

alias 是一個 shell 內建指令,可以為長指令建立簡短的別名。語法格式為:

alias 別名='實際指令'

建立 clean_zip 別名

讓我們建立一個名為 clean_zip 的別名:

  1. 在終端機中輸入以下指令來編輯 .zshrc:
nano ~/.zshrc
  1. 在檔案末尾加入以下行:
alias clean_zip='for f in *.zip; do zip -d "$f" "__MACOSX/*" "*.DS_Store"; done'
  1. 儲存並離開編輯器:
    • 按 Control + X
    • 按 Y 確認儲存
    • 按 Enter 確認檔名
  2. 重新載入設定檔:
source ~/.zshrc

現在你就可以使用簡短的 clean_zip 指令來清理壓縮檔了!

實際示範:使用 clean_zip 清理檔案

讓我們做一次完整的示範,展示如何使用新建立的 alias:

步驟 1:導航到目標資料夾

cd /Users/你的使用者名稱/Desktop/需要清理的資料夾

步驟 2:執行清理指令

輸入 clean_ 然後按 Tab 鍵,你會發現指令會自動補全為 clean_zip:

clean_zip

按 Enter 執行,你會看到類似以下的輸出:

deleting: __MACOSX/
deleting: __MACOSX/._檔案1.txt
deleting: __MACOSX/._檔案2.pdf
deleting: .DS_Store
deleting: 子資料夾/.DS_Store
zip warning: name not matched: *.DS_Store

(最後一行的警告是正常的,表示某些檔案中沒有 .DS_Store 檔案)

結語

透過本文介紹的方法,你再也不用為 macOS 壓縮檔中的額外檔案感到困擾了。使用 clean_zip 指令,你可以快速清理所有壓縮檔,確保傳送給其他作業系統使用者的檔案乾淨整潔。

記住,良好的跨平台檔案分享習慣不僅能提升專業形象,更能避免不必要的困擾和誤解。現在就試試看,讓你的檔案分享更加順暢吧!