.DS_Storeを削除するコマンドと、増やさない設定の決め方

ds_store 削除で検索する状況は、たいてい2つに分かれる。共有フォルダやZIPの中に見慣れないファイルが混ざっていて相手に指摘された場合と、リポジトリの差分に毎回.DS_Storeが出てきて邪魔になっている場合である。どちらも削除コマンド自体は1行で済むが、消した翌日に同じ場所へ戻ってくるので、削除と並べて「作られる側」をどう扱うかを決めておかないと作業が終わらない。ここでは削除の手順と、設定で止まる範囲、止まらない範囲を分けて整理する。

このファイルが持っているのは、フォルダの見え方の情報

.DS_StoreはFinderがフォルダごとに作る設定の控えで、そのフォルダをどう表示するかという情報が入っている。アイコン表示かリスト表示か、並び順、ウインドウの大きさと位置、アイコンを手で置いた座標、表示している列の構成などである。フォルダを開いてウインドウを動かし、並び順を変えると、その結果が書き込まれる。

つまり中身は個人の作業環境の記録であり、書類そのものではない。消してもフォルダの中のファイルは1つも失われず、次に開いたときに既定の表示に戻るだけである。この点が分かっていれば、削除の判断で迷う理由は無い。逆に言えば、消すことで得られるものも「相手の画面に見えなくなる」ことと「差分に出なくなる」ことに限られ、容量の回収はほぼ期待できない。1つのファイルは数キロバイトから数十キロバイトの範囲で、1,000個集めても数十メガバイトに届かない。

気をつけたいのは、中身が表示情報だけとは言い切れない点である。過去にそのフォルダに置かれていたファイルの名前が残ることがあり、外部へ渡す圧縮ファイルに混ぜると、削除したはずの下書きの名前が相手に見える場合がある。社外に渡す成果物から外す理由は、見た目の問題ではなくここにある。

一括削除は、消す前に一覧を出してから

削除はfindで足りる。ホームディレクトリ全体や作業用のフォルダを対象に、名前で拾って消す形になる。

find . -name '.DS_Store' -type f -print
find . -name '.DS_Store' -type f | wc -l
find . -name '.DS_Store' -type f -ls -delete

上から順に、対象の一覧を出す、件数を数える、一覧を出しながら消す、という3段になっている。

-printで確かめてから-deleteに変えるという順番が大事になる。名前を.DS_*のような形に広げると.DS_Store以外も巻き込むため、名前は省略せずに書く。またsudoを付けてルートから走らせると、Time Machineのバックアップ領域や他の利用者のフォルダまで対象に入るので、対象はホームディレクトリか特定のプロジェクトに限るほうが扱いやすい。

-deleteはゴミ箱を経由しない。.DS_Storeに限れば取り消す必要のあるファイルではないので問題は起きにくいが、同じ書き方を他のファイル名に流用すると事故になる。削除コマンドを記憶で書き換えず、対象の名前だけを差し替える形にしておくと安全である。

毎回打つのが手間なら、短い名前を付けておく方法が広く使われている。

$ find . -name '.DS_Store' -type f -ls -delete

alias dsstore="find . -name '*.DS_Store' -type f -ls -delete" のように、エイリアスを .bashrc なり .zshrc なりに書いておくと dsstore コマンドで使えるようになる。 出典: qiita.com

同じ記事では、npm install -g dsstore-cliで入れる小さなコマンドも紹介されている。やっていることはfindと同じで、見た目が整うだけだと書かれている。道具を増やす前に、自分の環境で1行が通るかを見たほうが早い。

中身を確かめてから消したいときは

削除して困らないかを自分で確かめたい場合、中身は読める形で見られる。file .DS_Storeと実行するとApple Desktop Services Storeと返り、専用の形式であることが分かる。strings .DS_Storeに通すと、先頭にBud1という印が出たあと、showIconPreview、sortColumn、iconSize、scrollPosition、textSize、useRelativeDatesといった名前が並ぶ。どれも表示の設定項目で、リスト表示のときにどの列を出すかという情報もname、size、kind、dateModified、dateCreated、dateLastOpened、label、commentsという形で入っている。

同時に、そのフォルダに置かれていたファイル名が文字列として残っていることも確認できる。フォルダの中身を並べ替えた時点の記録なので、すでに消したファイルの名前が残る場合がある。外部へ渡す圧縮ファイルから外す理由はここにあり、表示の設定が漏れることを気にしているわけではない。

大きさもここで見ておくとよい。長く使っているフォルダのものは14KB程度まで育つが、作ったばかりのフォルダでは数キロバイトに収まる。削除で空く容量を期待する作業ではないと分かる。

Appleが案内している設定が効くのは、ネットワーク共有だけ

削除の次に出てくる疑問が「そもそも作らせないようにできるか」である。Appleは設定を1つ案内しているが、効く範囲は限られている。

SMB のファイルブラウジングを高速化するには、macOS が SMB 共有上の「.DS_Store」ファイルを読み取らないように阻止できます。そうすれば、Finder で基本情報だけを使って、各フォルダの中身がすぐにアルファベット順で表示されるようになります。 出典: support.apple.com

このページで案内されているのはdefaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUEという設定で、適用後にログアウトとログインが要る。対象はSMB共有などのネットワーク上のフォルダで、NASや社内のファイルサーバに.DS_Storeが撒かれるのを止められる。共有フォルダを使う職場で相手に指摘される経路はこれで塞がる。

一方で、手元のディスクに作られる分は止まらない。デスクトップ、書類フォルダ、リポジトリの中はネットワーク共有ではないので、設定を入れても今までどおり作られる。「設定したのにまだ出る」という状況は設定が効いていないのではなく、効く場所が違うだけである。手元の分は作られる前提で、混ざらない仕組みを別に用意することになる。

Appleのページは表示の高速化を目的に書かれている点も押さえておきたい。ネットワーク共有の表示が遅いときの対処として案内されているもので、副作用として書き込みも止まる。並び替えなどの表示情報を共有フォルダで保持したい場合は、設定をFALSEに戻す手順も同じページに載っている。

共有物とリポジトリに混ざるのを止める

手元に作られること自体は害が無く、困るのは外へ出るときである。出口は主に3つで、それぞれ別の対処になる。

  • Gitの差分。個人の環境の記録なので、プロジェクトごとの.gitignoreではなく、利用者ごとの除外設定に書くほうが筋が通る。git config --global core.excludesFile ~/.gitignore_globalを設定し、そのファイルに.DS_Storeを1行入れておくと、どのリポジトリでも差分に出なくなる
  • ZIPなどの圧縮ファイル。コマンドで作るならzip -r 資料.zip 資料 -x '*.DS_Store'のように除外を指定する。Finderの「圧縮」で作った場合は含まれるため、渡す前に中身を確認するか、先に一括削除してから固める
  • rsyncやscpでの転送。rsyncなら--exclude='.DS_Store'を付ける。除外の指定は転送のたびに書くのではなく、設定ファイルか短い名前にまとめておくと忘れにくい

除外の指定を「その場で書く」運用にすると抜ける。Gitは利用者ごとの設定に1回書けば以後は効くが、圧縮と転送は毎回コマンドを組み立てる形になりやすい。渡す作業が月に何度もあるなら、除外まで含めた1行を短い名前にして置いておくほうが確実である。相手から指摘される回数は、覚えているかどうかではなく、手順が固定されているかどうかで決まる。

Windowsの利用者に渡した圧縮ファイルで指摘されるのは、.DS_Storeと、._から始まるもう1種類のファイルが同時に出るためである。後者はファイルの付加情報を別ファイルに分けて保存したもので、.DS_Storeとは別の仕組みで作られる。除外の指定を書くときは両方を対象にしておくと、渡した先での説明が1回で済む。

消しても戻ってくることを、失敗と数えない

一括削除を走らせた翌日に同じ場所で見つかると、コマンドが効いていないように見える。実際には、削除は成功していて、そのあとFinderでフォルダを開いたときに新しく作られている。表示情報の控えなので、フォルダを見た時点で書かれるのが正常な動きである。

そのため、ここは1回で終わる作業ではなく定期的に流す作業として扱うほうが合っている。プロジェクトを相手に渡す直前、リリース用の資料をまとめる直前、リポジトリをコミットする直前という具合に、外へ出る手前に1回入れておく。前の節で挙げた除外設定を入れておけば、外へ出る経路そのものが塞がるので、削除を走らせる回数も減る。

バックアップとの関係も押さえておきたい。Time Machineの対象から.DS_Storeを外す設定は用意されていないため、バックアップ先にも同じファイルが入る。ただし戻すときに表示の設定が復元されるだけなので、気にする必要は薄い。気にすべきなのは逆で、バックアップ領域を一括削除の対象に含めないことである。対象をホームディレクトリに限れば、この問題は起きない。

やってはいけないのは、Finderで隠しファイルを表示する設定にしたまま、目に付いたものを手で消していくことである。フォルダの数だけあるので終わらないうえ、隠しファイルが見える状態は他の設定ファイルを誤って動かす原因になる。表示して探すのではなく、名前を指定して機械に拾わせる。

削除そのものより、窓の行き来で時間が消える

この作業で実際に時間を取られているのは、コマンドの中身ではなく場所の移動である。対象のフォルダはFinderで開いていて、削除はターミナルで打ち、結果の確認はまたFinderに戻る。パスをコピーして貼り付ける往復が1回あたり数秒で、対象のプロジェクトが複数あるとそれだけで数十回になる。フォルダとターミナルとAIが同じ窓にある状態なら、いま見ているフォルダがそのまま作業ディレクトリになるので、貼り付けの往復が消える。

道具として何をどこまで引き受けるのかはできることに整理してある。ターミナルを内側に持つ形と、2つの窓を並べる形では解いている問題が違うので、その差は他のファイル管理との比較を見るほうが早い。

閲覧のされ方を見ると、.DS_Storeの削除を調べた読者が次に開くのは、容量の記事ではなくファイル名の一括変更や重複ファイルの整理の記事である。隠しファイルを気にする段階にいる人は、渡す成果物の形を整えたい人であり、名前と置き場所の決めごとを探している、という見立てと合っている。削除コマンドを覚えることと、渡す前の手順を1つ決めることでは、後者のほうが効き続ける。導入後に出やすい疑問はよくある質問にまとめてある。

よくある質問

.DS_Storeを削除するとフォルダの中身に影響はある?

中身のファイルは1つも変わらない。入っているのは表示方法の控えで、アイコン表示かリスト表示か、並び順、ウインドウの位置、手で置いたアイコンの座標といった情報である。削除するとそのフォルダの表示が既定の状態に戻り、開き直したときに新しく作られる。

一括削除のコマンドはどう書けばよい?

対象のフォルダでfind . -name '.DS_Store' -type f -ls -deleteを実行する。いきなり消すのが不安なら、先に-deleteを外して-printにすると対象の一覧だけが出る。名前を.DS_*のように省略すると別のファイルを巻き込むため、名前は最後まで書く。

作られないようにする設定はある?

Appleが案内しているdefaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUEは、SMB共有などネットワーク上のフォルダに書き込むのを止める設定である。適用後にログアウトとログインが要る。手元のディスクに作られる分はこの設定では止まらないため、Gitの除外設定や圧縮時の除外指定で対処する。

Gitの差分に出てくるのを止めるには?

プロジェクトの.gitignoreではなく、利用者ごとの除外設定に書くほうが扱いやすい。git config --global core.excludesFile ~/.gitignore_globalを設定し、そのファイルに.DS_Storeと._*を書いておくと、どのリポジトリでも差分に出なくなる。共同作業者の環境ごとの事情をプロジェクト側に持ち込まずに済む。

記事一覧へ戻る