職場や自宅では、クライアントマシンとしてMacを使っている(+Manjaro in Thinkpad)。 で、個人的にその日の作業用に日付別のディレクトリ(自分の場合は~/Work/YYYYMM/YYYYMMDD/)を作っておいて、そこに一時ファイルやダウンロードしてきたファイル、その日のメモなどを配置するような使い方をしている。

このとき、ダウンロードディレクトリ (~/Downloads)を日付別のダウンロードディレクトリ(~/Work/YYYYMM/YYYYMMDD/Downloads)のシンボリックリンクとすることで、ディレクトリが日付別になっていることを意識せずにアクセスできるかと思ったのだが、MacのDockからだとシンボリックリンクの中身は直接見れないようだ。 これだとちょっと使い勝手が悪いので、うまいことDockのディレクトリの向き先をディレクトリ本体にすることで、ディレクトリの中身に直接アクセスできるようにしたい。

結論としては、Dockにディレクトリとして日付別のダウンロードディレクトリを追加するようなジョブを定期的に実行させることで対処した。 MacOSでは、「$HOME/Library/Preferences/com.apple.dock.plist」というファイルにDockのデータが保存されているので、まずどのようなデータが入ってるのかを確認してみよう。 以下のコマンドで、Dockの右側(ダウンロードディレクトリがある範囲)のデータが取得できる。

plutil -extract "persistent-others" xml1 -o - $HOME/Library/Preferences/com.apple.dock.plist</code>

以下、実行例。

$ plutil -extract "persistent-others" xml1 -o - $HOME/Library/Preferences/com.apple.dock.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>GUID</key>
        <integer>3721503696</integer>
        <key>tile-data</key>
        <dict>
            <key>arrangement</key>
            <integer>1</integer>
            <key>book</key>
            <data>
            Ym9va8gDAAAAAAQQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
            AAAAAAAAAAAAxAIAAAUAAAABAQAAVXNlcnMAAAAIAAAAAQEAAGJs
            YWNrbm9uBAAAAAEBAABXb3JrBgAAAAEBAAAyMDIwMDEAAAgAAAAB
            AQAAMjAyMDAxMDUJAAAAAQEAAERvd25sb2FkcwAAABgAAAABBgAA
            BAAAABQAAAAkAAAAMAAAAEAAAABQAAAACAAAAAQDAACQoQoAAAAA
            AAgAAAAEAwAAumsQAAAAAAAIAAAABAMAAMVAHgAAAAAACAAAAAQD
            AACS/UQCAAAAAAgAAAAEAwAA9IpNAgAAAAAIAAAABAMAAPWKTQIA
            AAAAGAAAAAEGAACEAAAAlAAAAKQAAAC0AAAAxAAAANQAAAAIAAAA
            AAQAAEHB4G/4DWZMGAAAAAECAAACAAAAAAAAAA8AAAAAAAAAAAAA
            AAAAAAAIAAAABAMAAAQAAAAAAAAABAAAAAMDAAD1AQAACAAAAAEJ
            AABmaWxlOi8vLwwAAAABAQAATWFjaW50b3NoIEhECAAAAAQDAAAA
            oCBodAAAAAgAAAAABAAAQcDATpY0AbUkAAAAAQEAAEJEQTg4RTU3
            LTA5MzgtNDgwMi1BRkVDLTc0NjkxMDE4NzhGRhgAAAABAgAAgQAA
            AAEAAADvEwAAAQAAAAAAAAAAAAAAAQAAAAEBAAAvAAAAAAAAAAEF
            AADIAAAAAQIAAGZhY2ZlZDc2NmE4YzNjMTc2NTgyZGRmZTIyOTJi
            YzNmOWEzOWFmMDE7MDA7MDAwMDAwMDA7MDAwMDAwMDA7MDAwMDAw
            MDA7MDAwMDAwMDAwMDAwMDAyMDtjb20uYXBwbGUuYXBwLXNhbmRi
            b3gucmVhZC13cml0ZTswMTswMTAwMDAwNTswMDAwMDAwMDAyNGQ4
            YWY1OzAxOy91c2Vycy9ibGFja25vbi93b3JrLzIwMjAwMS8yMDIw
            MDEwNS9kb3dubG9hZHMAzAAAAP7///8BAAAAAAAAABAAAAAEEAAA
            ZAAAAAAAAAAFEAAA5AAAAAAAAAAQEAAAFAEAAAAAAABAEAAABAEA
            AAAAAAACIAAA4AEAAAAAAAAFIAAAUAEAAAAAAAAQIAAAYAEAAAAA
            AAARIAAAlAEAAAAAAAASIAAAdAEAAAAAAAATIAAAhAEAAAAAAAAg
            IAAAwAEAAAAAAAAwIAAA7AEAAAAAAAABwAAANAEAAAAAAAARwAAA
            FAAAAAAAAAASwAAARAEAAAAAAACA8AAA9AEAAAAAAAA=
            </data>
            <key>displayas</key>
            <integer>0</integer>
            <key>file-data</key>
            <dict>
                <key>_CFURLString</key>
                <string>file:///Users/blacknon/Work/202001/20200105/Downloads/</string>
                <key>_CFURLStringType</key>
                <integer>15</integer>
            </dict>
            <key>file-label</key>
            <string>ダウンロード</string>
            <key>file-mod-date</key>
            <integer>74405370385771</integer>
            <key>file-type</key>
            <integer>2</integer>
            <key>parent-mod-date</key>
            <integer>142862854118619</integer>
            <key>preferreditemsize</key>
            <integer>-1</integer>
            <key>showas</key>
            <integer>0</integer>
        </dict>
        <key>tile-type</key>
        <string>directory-tile</string>
    </dict>
...

上は自分の環境で実行した場合の結果なのだが、ダウンロードディレクトリの向き先であることがわかる。 また、一部のBase64になっている箇所があるようなのでデコードしてみると、ここにもPATHが記述されているようだ。

流石にファイルを直接イジるのはちょっと怖いので、defaultコマンド(MacOSで使えるplistの設定変更コマンド)で処理をする。 以下のようにコマンドを実行することで、Dockのダウンロードディレクトリを指定したディレクトリとすることができる。

defaults write com.apple.dock persistent-others -array-add '<dict><key>tile-data</key><dict><key>arrangement</key><integer>1</integer><key>displayas</key><integer>0</integer><key>file-data</key><dict><key>_CFURLString</key><string>file:///Users/blacknon/Work/202001/20200101/Downloads</string><key>_CFURLStringType</key><integer>15</integer></dict><key>file-label</key><string>ダウンロード</string><key>file-mod-date</key><integer>74405370385771</integer><key>file-type</key><integer>2</integer><key>parent-mod-date</key><integer>142862854118619</integer><key>preferreditemsize</key><integer>-1</integer><key>showas</key><integer>0</integer></dict><key>tile-type</key><string>directory-tile</string></dict>'

実際に使う場合は、別途スクリプトにしてディレクトリPATHを変動させるのがいいだろう。

あとは、これを定期的に実行するようジョブとして登録するだけだ。 MacOSの場合、cronではなく以下のようなxmlを作り、それをlaunchctlで登録するのが推奨されているようだ(登録されている内容は自分の環境のもの)。

~/Library/LaunchAgents/sh.mkworkln.plist
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <!-- label --> <key>Label</key> <string>sh.myworkln.plist</string> <!-- script --> <key>ProgramArguments</key> <array> <string>bash</string> <string>/Users/blacknon/dotfiles/bin/mkworkln.sh</string> <string>/Users/blacknon/dotfiles/lib/docktemplete_downloads.txt</string> <string>/Users/blacknon/dotfiles/lib/docktemplete_parallels.txt</string> </array> <!-- launchctl loadしたタイミングで実行するか --> <key>RunAtLoad</key> <true/> <!-- カレンダー指定(毎日0時0分に実行) --> <key>StartCalendarInterval</key> <dict> <key>Minute</key> <integer>0</integer> <key>Hour</key> <integer>0</integer> </dict> <!-- ログの指定 --> <key>StandardErrorPath</key> <string>/Users/blacknon/log/cron/mkworkln.log</string> <key>StandardOutPath</key> <string>/Users/blacknon/log/cron/mkworkln.log</string> </dict> </plist>

xmlファイルを配置したら、ジョブとして実行されるよう以下のコマンドで登録をする。

launchctl load ~/Library/LaunchAgents/sh.mkworkln.plist
launchctl unload ~/Library/LaunchAgents/sh.mkworkln.plist # 内容を更新する場合は一度unloadをしてから再度load

ちょっと面倒だけど、これでダウンロードディレクトリを日付ごとに違うディレクトリを使えるようになった。 (正直なところ、ここまでやるくらいなら日次でダウンロードディレクトリ配下のファイルを移動させたほうが楽だったのでは無いかと思わなくもないけど、まぁ良しとしよう・・・)