← 所有文章

你的 Mac 有兩個「下載」資料夾——我把它們合而為一

在 Mac 上,幾乎所有軟體都把檔案下載到 ~/Downloads。它是本機的——而且出乎意料地,從不同步到 iCloud。「桌面與文件 iCloud 同步」這個功能只涵蓋桌面和文件,下載資料夾被刻意排除在外。

在 iPhone 或 iPad 上,Safari 卻存進另一個資料夾:iCloud Drive 裡的 Downloads(在 Mac 上是 ~/Library/Mobile Documents/com~apple~CloudDocs/Downloads)。這個才會跨裝置同步。

於是你有了兩個都叫「下載」的資料夾,而你在手機上抓的檔案,在 Mac 上遍尋不著。困擾我好幾年的小事。

唯一真正的單一路徑

你沒辦法讓 ~/Downloads 出現在 iOS 上——它本來就不同步。能在 Mac、iPad、iPhone 三台都看到的,只有 iCloud Drive 那個。所以要統一,就是讓 Mac 也用當下載資料夾。

乾淨的做法是 symlink——把 ~/Downloads 換成指向 iCloud 那個的連結。但它會失敗:

$ ln -s ~/Library/Mobile\ Documents/com~apple~CloudDocs/Downloads ~/Downloads
# ...rm ~/Downloads → Permission denied(權限不足)

卡關點:一條隱藏的「禁止刪除」ACL

~/Downloads 是受保護的特殊資料夾。即使用對的使用者、即使關掉沙盒,rmrmdir 都回 Permission denied。原因是 macOS 在它身上蓋的一條存取控制條目:

$ ls -lde ~/Downloads
 0: group:everyone deny delete

這條 ACL 明確禁止刪除這個資料夾。把它拆掉,資料夾就能替換了:

# 先把 ~/Downloads 裡的東西搬進 iCloud 那個資料夾。
chmod -N ~/Downloads     # 拆掉 ACL
rmdir   ~/Downloads      # 現在可以刪了
ln -s "$HOME/Library/Mobile Documents/com~apple~CloudDocs/Downloads" ~/Downloads

現在 ~/Downloads 就是 iCloud 那個了。Mac 上每次下載都落在跟手機同一處,Finder 側邊欄也會自動跟著連結走。

加碼:把圖標裝回去

替換之後,資料夾會顯示成普通樣子——那個藍色、帶下箭頭的下載圖標不見了。macOS 把那個圖標存在 CoreTypes 裡,可以當成自訂圖標重新套上:

ICNS="/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/DownloadsFolder.icns"
DIR="$HOME/Library/Mobile Documents/com~apple~CloudDocs/Downloads"
osascript -e 'use framework "AppKit"' \
  -e "set i to current application's NSImage's alloc()'s initWithContentsOfFile:\"$ICNS\"" \
  -e "current application's NSWorkspace's sharedWorkspace()'s setIcon:i forFile:\"$DIR\" options:0"
killall Finder

誠實的取捨

很方便,但不是免費的:

  • 現在所有下載都會上傳 iCloud——大型安裝檔也是。留意你的 iCloud 容量。
  • 空間不足時檔案會被驅逐成 placeholder;下載檔本來就是過渡性的,點一下就重抓回來。(不像 Git repo——iCloud 在寫入途中驅逐會真的把 .git 弄壞,那是完全不同等級的恐怖故事。)
  • macOS 大版更新可能會把 ~/Downloads 還原。真的還原了,把那三步再跑一次就好。
  • 完全可逆:刪掉 symlink、重建一個真實資料夾即可。

一件小事——但困擾我好多年了。從今以後,一個路徑搞定。🌊