在 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 是受保護的特殊資料夾。即使用對的使用者、即使關掉沙盒,rm/rmdir 都回 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、重建一個真實資料夾即可。
一件小事——但困擾我好多年了。從今以後,一個路徑搞定。🌊