當好意變成困擾
想像這樣一個場景:你是一名 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:開啟終端機
- 按
Command + Space開啟 Spotlight 搜尋 - 輸入「終端機」或「Terminal」
- 按 Enter 開啟應用程式
步驟 2:導航到壓縮檔所在的資料夾
這裡我們使用一個非常實用的技巧:拖曳 Finder 路徑
- 在終端機中輸入
cd(注意 cd 後面有一個空格) - 開啟 Finder,導航到包含壓縮檔的資料夾
- 將該資料夾直接拖曳到終端機視窗中
- 你會看到完整的路徑自動出現在
cd後面 - 按 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 檔案,將每個檔案名稱依次賦值給變數fdo ... done:定義迴圈要執行的動作zip -d "$f" "__MACOSX/*" "*.DS_Store":"$f"表示當前處理的檔案名稱(加引號防止檔名中的空格造成問題)- 對每個檔案分別執行刪除 __MACOSX 和 .DS_Store 的操作
指令運作流程
- 系統找到第一個 .zip 檔案,將檔名存入變數
f - 執行
zip -d指令清理該檔案 - 繼續處理下一個 .zip 檔案
- 重複直到所有 .zip 檔案都處理完畢
這個方法的優點是可以一次性處理整個目錄中的所有壓縮檔,無需手動逐一處理。
簡化操作:建立 alias 別名
每次都要輸入這麼長的指令確實很麻煩,也不容易記憶。我們可以透過建立 alias(別名)來簡化這個過程。
.zshrc 檔案的作用
.zshrc 是 Zsh shell(macOS Monterey 以後的預設 shell)的設定檔,位於你的家目錄中。這個檔案的作用包括:
- 定義環境變數
- 設定 shell 的行為和外觀
- 建立 alias 別名
- 載入自訂函數和腳本
每當你開啟新的終端機視窗時,系統會自動讀取並執行 .zshrc 中的設定。
alias 的功能
alias 是一個 shell 內建指令,可以為長指令建立簡短的別名。語法格式為:
alias 別名='實際指令'
建立 clean_zip 別名
讓我們建立一個名為 clean_zip 的別名:
- 在終端機中輸入以下指令來編輯 .zshrc:
nano ~/.zshrc
- 在檔案末尾加入以下行:
alias clean_zip='for f in *.zip; do zip -d "$f" "__MACOSX/*" "*.DS_Store"; done'
- 儲存並離開編輯器:
- 按
Control + X - 按
Y確認儲存 - 按 Enter 確認檔名
- 按
- 重新載入設定檔:
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 指令,你可以快速清理所有壓縮檔,確保傳送給其他作業系統使用者的檔案乾淨整潔。
記住,良好的跨平台檔案分享習慣不僅能提升專業形象,更能避免不必要的困擾和誤解。現在就試試看,讓你的檔案分享更加順暢吧!