【WSLトラブル】Windowsからのファイルコピーで謎の:Zone.Identifier
ファイル大量発生?原因と削除方法を解説
みなさんこんにちは!
普段WindowsとWSL (Windows Subsystem for Linux) を行き来しながら開発している皆さん、こんな経験はありませんか?
WindowsのエクスプローラーからWSL上のディレクトリにファイルをドラッグ&ドロップやコピペで持ってきたら、いつの間にか元のファイル名の後ろに :Zone.Identifier
が付いた、サイズ0の謎のファイルがたくさん作られていた…!
$ ls -alh
-rw-r--r-- 1 user user 4.5K Apr 11 16:46 init.sql
-rw-r--r-- 1 user user 0 Apr 11 16:44 init.sql:Zone.Identifier # ← なんだこれ!?
-rw-r--r-- 1 user user 8.2K Apr 11 16:46 config.yaml
-rw-r--r-- 1 user user 0 Apr 11 16:44 config.yaml:Zone.Identifier # ← こっちにも!
邪魔だし、数が増えると単純に見づらいですよね。これ、一体何者で、どうすれば消せるのでしょうか?
今回は、この :Zone.Identifier
ファイルの正体と、安全かつ効率的に削除する方法について解説します。
:Zone.Identifier
って何? ADS? xattr?
最初、このファイルを見たときなんだこれは?と思いましたが、調べてみるとWindowsの代替データストリーム (Alternate Data Stream, ADS)機能がLinux環境にゴミをたくさん作っているということが判明しました。
背景として、Windowsはインターネットからダウンロードしたファイルなどに出所情報を示すゾーン識別子 (Zone Identifier) をADSとして付与することがあります。WSL (特にWSL2) がLinuxファイルシステム (ext4など) を使うようになり、この情報が user.Zone.Identifier
というxattrとして引き継がれるケースがあるようです。
ls -al
の出力結果を見てみましょう。
-rw-r--r-- 1 user user 0 Apr 11 16:44 readme.md
-rw-r--r-- 1 user user 0 Apr 11 16:44 readme.md:Zone.Identifier
これはLinuxファイルシステム (ext4など) にADSやxattrが付与されている状態ではなく、単純に readme.md:Zone.Identifier
というファイル名を持つ、サイズ0の独立したファイル として存在していることを示しています。
試しに、拡張属性を削除するコマンド setfattr
を使ってみても…
$ setfattr -x user.Zone.Identifier readme.md:Zone.Identifier
setfattr: readme.md:Zone.Identifier: No such attribute # 属性がないよ!と怒られる
これは拡張属性を管理するファイルではなく、ファイル名にコロン :
が含まれているだけのゴミファイルのようでした。
:Zone.Identifier
ファイルを削除する方法
とりあえず不要なファイルは削除したいですよね。正体が「ファイル名にコロンが含まれる通常のファイル」だと分かれば、削除は簡単です。Linuxの標準的な rm
コマンドが使えます。
1. 特定のファイルを削除する場合
# ファイル名を正確に指定して削除
rm readme.md:Zone.Identifier
# 削除されたか確認
ls -al
ファイル名に特殊文字が含まれている場合は、クォーテーションで囲むか、バックスラッシュでエスケープする必要があるかもしれませんが、今回の :
に関してはそのまま指定して問題なさそうでした。
2. 大量にあるファイルを一括削除する場合
ディレクトリ内に大量の :Zone.Identifier
ファイルがある場合は、find
コマンドを使うのが効率的です。
重要: rm
や find ... -delete
はファイルを完全に削除するコマンドです。実行前に、本当に削除したいファイルだけが対象になっているか確認することを強く推奨します。
# カレントディレクトリ以下にある `:Zone.Identifier` で終わるファイルを検索して表示 (確認用)
find . -type f -name '*:Zone.Identifier' -print
# 確認後、問題なければ実際に削除 (-delete オプション)
find . -type f -name '*:Zone.Identifier' -delete
# もしくは -exec rm {} \; を使う場合 (少し遅いが確実)
find . -type f -name '*:Zone.Identifier' -exec rm {} \;
まず -print
で削除対象となるファイルリストを表示し、意図しないファイルが含まれていないか確認してから、-delete
オプションや -exec rm {} \;
で削除を実行しましょう。これで、散らかった :Zone.Identifier
ファイルを一掃できます。
まとめ
WindowsのエクスプローラーからWSLへファイルをコピーした際に生成される :Zone.Identifier
ファイルは、ADSやxattrではなく、単にファイル名にコロンが含まれたサイズ0の通常ファイルでした。
標準的ではない挙動のため原因特定は難しいですが、不要であれば rm
コマンドや find
コマンドを使って安全に削除できます。
もし同じ現象で困っていたら、ぜひこの方法を試してみてください!