特集

「なんだよこの.DS_Storeってゴミは」。WindowsユーザーにウザがられるMacの隠しファイル、まとめて楽に消す方法

MacとWindows間でファイルをやり取りしたことがあれば、こういったファイルを見かけるはず

 Macユーザーはほとんど意識することはないが、Macからファイルを受け取ったWindowsユーザーの側では、実はウザく感じていることがある。それは、macOS特有の隠しファイルが一緒にくっついてくることだ。

 ネットワークフォルダを共有しているとき、外部ストレージでファイルを受け取ったとき、圧縮ファイルを受信したとき、といった場面で、Windowsユーザーにとっては“ゴミ”とも言えるファイルが見えてしまう。今回は、この厄介なファイルへの対処方法を紹介したい。

macOS特有のウザいファイルとは?

 Macユーザーの知らないうちにmacOS上で自動で生成され、Windows側からだと“ゴミ”にも見えてしまうファイルは、「リソースフォーク」などと呼ばれるもの。主に下記の4種類が挙げられる。

WindowsではゴミにしかならないMacのファイルたち
macOSで生成される代表的なリソースフォーク(Windows上での表示)

「.DS_Store」ファイル

 macOSにおいてフォルダ内の設定情報などを記憶するためのファイル。ローカルストレージやネットワークフォルダに作成される。

「._XXX」ファイル

 macOSで外部ストレージや圧縮ファイルを扱う際、保存されているファイルごとに生成されることがある隠し属性のファイル。たとえば「abc.jpg」に対して「._abc.jpg」のような名前のファイルが同じ場所に生成される。

「._XXX」ファイルは実ファイル1つ1つに対応する形で生成される

「Icon?」ファイル

 macOSのカスタムフォルダアイコンのデータ。フォルダアイコンの見た目を変更した場合に、隠し属性ファイルとしてそのフォルダ内に作成される。「?」は実際にはキャリッジリターンで、Windows上では「・」に見える。

「__MACOSX」フォルダ

 フォルダ内の設定情報などを記憶するためのフォルダとファイル群。macOSの標準のファイル圧縮機能使用時にアーカイブ内に生成される。

「__MACOSX」フォルダの中には、圧縮された個別のファイルに対応する「._XXX」ファイルが保管されている

 これらのファイルやフォルダの多くはmacOS上では不可視(もしくは別の形で保管された状態)となっており、Macユーザーが目にすることはまずない。「Icon?」ファイルは単純な隠し属性ファイルのため、Finder上で「Command+Shift+.」キーを押すと見えるが、それ以外はmacOSのFinder上では通常見ることは不可能だ。

 どれもmacOSでは有効なデータではあるものの、あくまでもmacOSのファイル管理などにのみ利用されるものであって、Windowsの側では一切必要がないから削除してもまったく問題なし。

 macOSにおいても、これらが仮になくなったとしても、ファイル本体が破損するといったような問題にはならない。せいぜいアイコンの並びや見た目がリセットされるくらいだ。

 なのでWindowsユーザーとしては、これらが目障りに感じたのなら削除すればいいだろう。しかしながら、たとえばネットワークフォルダをMacユーザーと共有している場合、Macユーザーがそこにアクセスするたびに「.DS_Store」ファイルが自動生成されてしまうため、削除したところでキリがない。

 一方で、Macユーザーからはそもそも見えず、意識することがないので対処する必要性が薄く、気にせず不要なデータを大量生産し続けることになる。こうした関係からWindowsユーザーとMacユーザーの間で軋轢が生まれてしまったりも……。

 と、感情的な部分はともかく、本来不要なリソースフォークが含まれることでやり取りするファイルのサイズがいたずらに増加するケースもあり、その分ファイル転送や圧縮ファイルの展開に時間がかかるなど余計なリソースを消費してしまうのも厄介なところだ。

【Macユーザー側】一部のリソースフォークを生成しないようにする設定

 このようなmacOS特有のデータに関わる面倒な問題をどう解決するのがいいだろうか。まず1つは、そもそも作成されないようにすることが考えられる。そのためのmacOS側での設定方法もあり、たとえばターミナルで下記のコマンドを入力するというものがある。

ネットワークフォルダ内にリソースフォークを作成しないようにするコマンド

defaults write com.apple.desktopservices DSDontWriteNetworkStores true

 これを実行し、最後に「killall Finder」コマンドでFinderを再起動すると、以降はリソースフォークが作成されないようになる(trueの部分をfalseにすることで、元通りリソースフォークが作成されるようになる)。

 ただ、このコマンドを実行したところで、対象となるのはネットワークフォルダ内の「.DS_Store」ファイルのみ。しかも「以降は作成されなくなる」だけであって、すでに作成されているリソースフォークが自然に消えるわけではない。

 また、ネットではほかに以下のようなコマンドが紹介されていたりもするが、少なくとも最新のmacOS X Sequoia 15.5においては機能しない。ローカルストレージには「.DS_Store」ファイルが必ず生成されるし(「._XXX」ファイルはもともと生成されない)、外部ストレージには「._XXX」ファイルが必ず生成される(「.DS_Store」ファイルはもともと生成されない)。

ローカルストレージにリソースフォークを作成しないようにするコマンド

defaults write com.apple.desktopservices DSDontWriteLocalStores true

USBメモリなど外部ストレージにリソースフォークを作成しないようにするコマンド

defaults write com.apple.desktopservices DSDontWriteUSBStores true

 ちなみに外部ストレージでは「.DS_Store」ファイルは生成されないと説明したが、Macのローカルストレージからフォルダごとファイルをコピーした場合、その中に「.DS_Store」ファイルが存在すればそれもコピーされてしまう、という点には注意が必要だ。

【Macユーザー側】圧縮ファイル内にリソースフォークを含ませない設定

 以上を踏まえ、Macユーザーの側では「ネットワークフォルダ内にリソースフォークを作成しないようにするコマンド」を実行しておきたい(実行してもらいたい)ところ。それに加えて、可能であれば「圧縮ファイル内にリソースフォークが含まれるのを防ぐ」工夫をしておくと、チーム作業がより円滑になるだろう。

 具体的な手順は下記の通り。ポイントは、macOS標準の圧縮機能の代わりに「zip」コマンドを使用し、それをファイル・フォルダの右クリックメニューから実行できるようにすることだ。ここでは追加のアプリなどを使用せず、macOSの機能だけを用いた設定方法を解説しよう。

圧縮ファイルにリソースフォークが含まれるのを防ぐ方法

1. 「ショートカット」アプリを起動する
2. 「+」ボタンからショートカットの新規作成へ
3. 「i」アイコンから「クイックアクションとして使用」と「Finder」にチェック
4. 「画像、その他……」などと表示されている部分をクリックして「ファイル」と「フォルダ」のみチェック
5. 「続ける」をクリックして「停止して応答」を選択
6. 「アクションライブラリ」から「ターミナル」を選択し「シェルスクリプトを実行」を見つける
7. 「シェルスクリプトを実行」をウィンドウ左側にドラッグ&ドロップ
8. テキスト入力エリアに下記の内容を貼り付ける
for f in "$@"; do
  dir=$(dirname "$f")
  base=$(basename "$f")
  ts=$(date "+%Y%m%d")
  zipbase="${base// /_}_${ts}.zip"
  (
    cd "$dir" || exit 1        # 作業ディレクトリを対象フォルダへ
    /usr/bin/zip -r -X "$zipbase" "$base" -x "Icon?" "*/Icon?" ".DS_Store" "*/.DS_Store" "__MACOSX" "._*" "*/._*"
  )
done
9. その他の設定は下記のようになっていることを確認する
10. メニューに表示されるタイトルを入力。好みに合わせてアイコンも選ぶ

 以上の設定を行なうことで、ファイルやフォルダの右クリックメニューにある「クイックアクション」に、「ZIP圧縮」のような新しい項目が表示される。これを選択することでリソースフォークが取り除かれた状態のZIPファイルができあがるので、あとはそれをメール添付で送信するなり、外部ストレージにコピーするなり、クラウドストレージにアップロードするなりしてWindowsユーザーと共有すればよい。

「クイックアクション」にファイル圧縮する項目が表示

  ただし「._XXX」ファイルについては、外部ストレージにファイルをコピーしたり、そこでファイルを開いたりしたときに生成されてしまううえ、生成を抑制する設定等が今のところないことなどから、Mac側での対処が難しい。

 Windowsユーザーに渡す前に一括削除するコマンドを実行することも考えられるものの、あまり現実的ではないだろう(一度削除したところでその後すぐに生成されてしまう可能性があるため)。

【Windowsユーザー側】圧縮ファイルからリソースフォークを取り除く方法

 Macユーザー側で以上の設定をしてもらえれば、Windows側では「._XXX」ファイル以外については特に対策する必要がない。とはいえ、Macユーザーが同僚などの身近な人であるならまだしも、ビジネス上の相手だったりするとこうした設定をお願いするのは難しくなってくる。

 その場合はWindows(自分)の側でなんとかするしかない。ただ、「._XXX」ファイルも含め手作業で削除するのは避けたい。ということで、受け取った圧縮ファイル(ZIPファイルを想定)を可能な限り簡便に、不要なリソースフォークを取り除きつつ展開する方法を考えてみた。

 シンプルな操作になるよう、ここではWindows標準の機能のみを使うことを前提に、「ドラッグ&ドロップで展開する方法」と、「“送る”メニューから展開する方法」の2パターンを例として挙げている。

圧縮ファイルからリソースフォークを除去しつつドラッグ&ドロップで展開する方法

1. 以下の内容を「extract_clean.ps1」というファイル名で作成し、デスクトップに保存する
圧縮ファイルの展開時にリソースフォークを取り除くスクリプト「extract_clean.ps1」
--- 「extract_clean.ps1」の例 ---

param([Parameter(ValueFromRemainingArguments)][string[]]$ZipPath)

foreach ($zip in $ZipPath) {
    if (-not (Test-Path $zip -PathType Leaf)) { Write-Warning "Cannot find $zip"; continue }

    $zipFull  = (Resolve-Path $zip).Path
    $destRoot = Split-Path  $zipFull
    $baseName = [IO.Path]::GetFileNameWithoutExtension($zipFull)
    $dest     = Join-Path $destRoot "$baseName`_clean"

    if (Test-Path $dest) { Remove-Item $dest -Recurse -Force }
    New-Item -ItemType Directory -Path $dest | Out-Null

    tar -xf $zipFull `
        --directory  $dest `
        --exclude="__MACOSX"      --exclude="__MACOSX/*" `
        --exclude="._*"           --exclude="*/._*" `
        --exclude=".DS_Store"     --exclude="*/.DS_Store" `
        --exclude="Icon?"        --exclude="*/Icon?"
    Write-Host "Completed => $dest"
}
2. PowerShellを「管理者として実行」で起動し、以下のコマンドを実行する
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
3. デスクトップで右クリックし、「新規作成」→「ショートカット」を選択
4. 表示されるダイアログの「項目の場所」に下記コマンドを貼り付けて「次へ」
powershell -NoProfile -ExecutionPolicy Bypass -Command "& \"$env:USERPROFILE\Desktop\extract_clean.ps1\" %*"
5. ショートカット名を設定し「完了」
6. ショートカットに圧縮ファイルをドラッグ&ドロップすると展開される

圧縮ファイルからリソースフォークを除去しつつ「送る」メニューから展開する方法

1. PowerShellを「管理者として実行」で起動し、以下のコマンドを実行する
(「ドラッグ&ドロップで展開する方法」の手順ですでに実行している場合は不要)
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
2. スタートボタンを右クリックし「ファイル名を指定して実行」をクリック
3. 「shell:sendto」と入力して実行
4. 「SendTo」フォルダが表示されるので、その中で右クリックし「新規作成」→「ショートカット」を選択
(「ドラッグ&ドロップで展開する方法」の手順で作成したショートカットをコピーしてもOK)
5. 表示されるダイアログの「項目の場所」に下記コマンドを貼り付ける
(スクリプトは「ドラッグ&ドロップで展開する方法」の手順で作成したものを流用)
powershell -NoProfile -ExecutionPolicy Bypass -Command "& \"$env:USERPROFILE\Desktop\extract_clean.ps1\" %*"
6. ショートカット名を設定し「完了」
7. 圧縮ファイルを右クリックし、「送る」からショートカットを選ぶことで展開される

 なお、Windows 11だと、初めに表示されるモダンメニューの「その他のオプションを確認」を選んだ後に「送る」メニューが表示される流れになる。若干手数が多くなってしまうため、初めに解説したドラッグ&ドロップする方法が最も簡単に使えそうだ。

【Windowsユーザー側】既存のフォルダからリソースフォークを一括削除する方法

 以上の考え方を応用することで、リソースフォークが大量に含まれている既存のフォルダを対象に、それらリソースフォークを一括削除するようなコマンドを作ることもできるだろう。

 たとえば以下の内容を「clean_resfork.ps1」などのファイル名で保存して、先ほどと同じようにショートカット化すれば、そのショートカットにフォルダをドラッグ&ドロップするだけで配下にあるリソースフォークを根こそぎ削除できる。 ただし、一歩間違えれば必要なファイルも削除されてしまう可能性があるため、動作確認は慎重に行ないたい。

既存のフォルダからリソースフォークを取り除くスクリプト「clean_resfork.ps1」
--- 「clean_resfork.ps1」の例 ---

param(
    [Parameter(ValueFromRemainingArguments)]
    [string[]]$TargetPaths
)

$junkFolders = @('__MACOSX')
$junkFiles   = @('._*', '.DS_Store', 'Icon?')

foreach ($path in $TargetPaths) {
    $dir = Resolve-Path -LiteralPath $path -ErrorAction SilentlyContinue
    if (-not $dir) {
        Write-Warning "$path is not exist. Skipping"
        continue
    }
    $dir = $dir.Path
    if (-not (Test-Path $dir -PathType Container)) {
        Write-Warning "$dir is not directory. Skipping"
        continue
    }

    foreach ($jf in $junkFolders) {
        Get-ChildItem -Path $dir -Recurse -Directory -Filter $jf -Force -ErrorAction SilentlyContinue |
            ForEach-Object {
                try   { Remove-Item -Recurse -Force -LiteralPath $_.FullName -ErrorAction Stop }
                catch { Write-Error "Failed to delete [$($_.FullName)] : $_" }
            }
    }

    foreach ($jp in $junkFiles) {
        Get-ChildItem -Path $dir -Recurse -File -Filter $jp -Force -ErrorAction SilentlyContinue |
            ForEach-Object {
                try   { Remove-Item -Force -LiteralPath $_.FullName -ErrorAction Stop }
                catch { Write-Error "Failed to delete [$($_.FullName)] : $_" }
            }
    }
}

MacユーザーとWindowsユーザーがお互いを思いやって設定しておこう

 MacユーザーはWindowsユーザーの利便性を考え、Windowsユーザーは自分やみんなの仕事を増やさないように、以上のようなリソースフォークを扱わずに済む設定を互いに行なっておくのがおすすめ。これで仕事中に無用なストレスを抱えてしまうこともなくなるはずだ。

 しかし、やり取りする相手が増えたときやPCを新調した際には、改めて同じ設定を(お願い)する必要がある、というのはネックではあるので、いずれはmacOS側もWindows側も歩み寄り、こうした手間のかかる設定が不要になる未来に期待したいものだ。