← 記事一覧

Mac には「ダウンロード」フォルダが2つある。ひとつにまとめた話。

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 は保護された特殊フォルダだ。正しいユーザーでも、サンドボックスを切っても、rmrmdirPermission 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 を消して本物のフォルダを作り直すだけ。

小さなことだが——何年も気になっていた。これで、パスはひとつ。🌊