Cygwin/MSYS2とごみ箱にできる謎のファイルの関係


CygwinやMSYS2を使っていると、ごみ箱に謎のファイルが (場合によっては数百MB以上) できることがあることに気づき、調べてみました。

ごみ箱の中身をエクスプローラーから確認

Windowsのごみ箱は、各ドライブのルートディレクトリに $Recycle.bin というディレクトリが作られ、その下に各ユーザーのディレクトリが、SID (Security Identifier)と同じ名前で作られます。自分のSIDはwhoami /userコマンドで確かめることができます。

C:\>whoami /user

USER INFORMATION
----------------

ユーザー名 SID
========== =============================================
mmm\uuu    S-1-5-21-XXXXXXXXX-YYYYYYYYYY-ZZZZZZZZZZ-WWWW

さて、エクスプローラーでごみ箱の中を見てみましょう。
「表示」→「隠しファイル」にチェックを入れて、隠しファイルも見えるようにした上で、C:\$Recycle.binを開いてみます。

SIDのディレクトリがいくつか作られ、最後にごみ箱とあるのが見えます。
もし、何も表示されない場合は、「表示」→「オプション」をクリックし、「表示」タブを開き、「保護されたオペレーティング システム ファイルを表示しない (推奨)」のチェックを外します。

他のユーザーのごみ箱はSIDが見えますが、自分のごみ箱はエクスプローラーがSIDをごみ箱に変換して表示しており、SIDは表示されません。自分以外にユーザーがいない場合は、S-1-5-18ごみ箱のみが表示されているかもしれません。(S-1-5-18ローカルシステムアカウントです。)

ごみ箱をダブルクリックして、ごみ箱の中を見てみます。

「このフォルダーは空です。」と表示されています。
次に、C:\$Recycle.binに戻って、ごみ箱のプロパティを見てみます。

なぜか、13.5 MBのファイルがあると表示されています。

ごみ箱の中身をCygwin/MSYS2から確認

Cygwin/MSYS2からごみ箱の中を見てみます。
minttyを開いて、cd␣まで入力し、エクスプローラーからごみ箱ディレクトリをminttyのウィンドウにドラッグ&ドロップすると、ごみ箱のディレクトリのフルパスが入力されるので、Enterを押せばごみ箱のディレクトリに簡単に移ることができます。

ls -aFコマンドを実行してファイルの一覧を見てみます。

.で始まり、8進数表記されたバイト列があり、その後16進数が並んだ変な名前のファイルが複数あることが確認できます。

この変なバイト列は何でしょうか。確認するために以下のコマンドを実行して、バイト列をテキストファイルに保存してみます。(bash では、$'\ooo'という表記で8進数で文字コードを表現できます。$'\xXX'であれば16進数表記になります。)

$ echo $'\355\261\255\355\261\263\355\261\271\355\261\263' > x.txt

これをVimで、UTF-8として開いてみます。

上位8bitが0xDCのコード、すなわち、ローサロゲートのコードが並んでいるのが確認できます。
ここから下位8bitだけを取り出してみると、6d 73 79 73となり、実はmsysという文字列であることに気づくでしょう。
msysの他にも、cygsmymとなるパターンがあることが分かっています。このことから、これらのファイルはCygwinやMSYS2に関係ありそうだと分かります。

謎のファイルの正体

Linuxでは、開いているファイルであっても(権限さえあれば)削除することができます。一方、Windowsでは、開いているファイルは、移動することはできても削除することはできません。
Cygwin/MSYS2では、Linuxの挙動をWindows上で模倣するため、ファイルを開くときにはFILE_SHARE_DELETEフラグを指定しておき、開いているファイルを削除しようとしたときには、それをごみ箱に移動するということをやっているようで、この謎のファイルはそのときの一時ファイルです。ただし、FILE_SHARE_DELETEフラグを指定しても完全では無く、ファイルをクローズしてもファイルが削除されずに残ってしまう場合があるようです。

参考:

謎のファイルを削除する

上記の通り、この謎のファイルは、使用中のファイルをCygwin/MSYS2で削除しようとしたときにできる一時ファイルであり、ファイルを使っているプロセスが残っていなければ削除してしまって構いません。
念のためWindowsを再起動してからminttyを開き、ごみ箱のディレクトリに移ってから、以下のコマンドを実行してください。

$ ls .$'\355'*  # 余計なファイルがマッチしていないことを確認
$ rm .$'\355'*  # 削除を実行