Mac では、ほとんどのアプリが ~/Downloads にダウンロードする。これはローカルで、そして意外なことに iCloud と決して同期しない。「デスクトップと書類フォルダの iCloud 同期」はデスクトップと書類だけが対象で、ダウンロードは意図的に外されている。
iPhone や iPad では、Safari は別のフォルダに保存する。iCloud Drive 内の Downloads(Mac 上では ~/Library/Mobile Documents/com~apple~CloudDocs/Downloads)だ。こちらはどこでも同期する。
結果、「ダウンロード」という名前のフォルダが2つでき、スマホで取得したファイルが Mac のどこにも見当たらない。何年も続く地味な混乱。
唯一の本当の単一パス
~/Downloads を iOS に出すことはできない——そもそも同期しないからだ。Mac・iPad・iPhone の3台すべてで見えるのは 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 にアップロードされる——大きなインストーラも含めて。容量に注意。
- 空きが少ないとファイルはプレースホルダに退避される。ダウンロードは使い捨てなので、タップすれば再取得できる。(Git リポジトリとは違う——iCloud が書き込み中に退避すると
.gitが本当に壊れる。あれは別格の恐怖話だ。) - macOS のメジャーアップデートで
~/Downloadsが復元されることがある。復元されたら、3ステップをもう一度走らせればいい。 - 完全に元に戻せる:symlink を消して本物のフォルダを作り直すだけ。
小さなことだが——何年も気になっていた。これで、パスはひとつ。🌊