Windows Subsystem for Linux(WSL)を使った開発は便利ですが、Windows⇔WSL間のファイル操作には特有の課題があります。知らないとかなり面倒なのです。
今回は、WSL開発を快適にするテクニックとそれにまつわるトラブルの解決方法について紹介します。
- WSLディレクトリへのショートカット作成 - エクスプローラーから瞬時にアクセス(多分これはみんな思いつく🫡)
- Zone.Identifierファイル問題の解決 - ファイルコピー時に生成される謎のファイルを撲滅(何だこりゃ問題💦)
これらのテクニックを実装することで、Windows×WSLの連携が劇的に改善されます!
1. WSLディレクトリへのショートカット作成
なぜショートカットが必要なのか?というか必要だろ(常考)
WSLの開発ディレクトリにアクセスするたびに、ターミナルを開いて/mnt/c/User/ほげほげと入力したり、エクスプローラーで \\wsl$ から辿っていくのは非効率です。デスクトップやタスクバーにショートカットを作成することで、ワンクリックでアクセスできるようになります。
ショートカット作成の手順
基本簡単なので特に問題ないと思いますが…
1. WSLパスの取得
- エクスプローラーのアドレスバーに
\\wsl$と入力 - 目的のディストリビューション(例:
Ubuntu)を開く - ショートカットを作成したいフォルダへ移動
- アドレスバーに表示されている
\\wsl$\<ディストリビューション名>\...という形式のパスをコピー - 例:
\\wsl$\Ubuntu\home\username\projects
2. ショートカットの作成
デスクトップなどで右クリックし【新規作成】→【ショートカット】を選択

3. パスの貼り付け
【項目の場所を入力してください】の欄に、コピーしたWSLのパスを貼り付けて

名前を付けて完了

重要なポイント(ユーザー権限)
⚠️ セキュリティ上の注意点
- このショートカット経由でファイルやフォルダを操作する際、その操作はWSLディストリビューションの「デフォルトユーザー」の権限で実行されます
- Windowsのユーザー権限とは独立しているため、Linuxのファイルパーミッション(権限設定)新たに適用されます。
💡ショートカットのアイコンを変更したり、タスクバーにピン留めすることで、さらに素早くアクセスできるようになりますよ😎
しかし…
幸せである。だが…それだけでは終わりません。
この方法でWindowsから簡単にファイルへのアクセスができるようになる反面、別の問題が発生するのです。 それについて、以下で書いていきます。
2. Zone.Identifier問題の完全解決
実はWindowsのエクスプローラーから、WSL管理下のディレクトリにファイルをコピーや移動を行うと問題が発生します。それが、コピー後に末尾に:Zone.Identifierのついたファイルもコピーされることががあるのです。必ずしも起きるというわけではなく、ある特定の条件の場合に発生します。今回はそれをZone.Identifier問題と呼ぶことにします。
面倒なのは:がついたファイル名になることです💦
Zone.Identifierファイルとは?
先程もいった通り、エクスプローラーからWSL管理下のディレクトリにファイルをドラッグ&ドロップすると、hoge.txt:Zone.Identifierのような謎のファイルが自動生成されることがあります。

なぜZone.Identifierファイルが生成されるのか?
インターネットからダウンロードしたファイルや、他のPCからコピーされたファイルに対し、Windowsは「このファイルは外部から来たもので、潜在的なリスクがある」というフラグ(Zone.Identifier)を付けます。

このフラグは通常エクスプローラー上では見えないのですが、WSL(Linux)のファイルシステムにコピーされると、Linux側ではこの内容を理解できないため、:Zone.Identifierという別ファイルとして可視化するようです。
⚠️ 1. で作成したショートカット経由でファイルをコピーする場合も、Zone.Identifier問題は発生します。
特にWebブラウザでダウンロードしたファイルをコピーしたときに、いきなり見慣れないファイルがでてくるのは心臓に悪いです。
簡単にファイルにアクセスできるようになったにも関わらず、こんな罠が…。
(解決策1)Windows側でファイルにつけられたブロック情報(フラグ)を一括解除するPowerShellスクリプト
WSLにコピーする前に、Windows側でこの「ブロック」情報のフラグを解除してしまえば、謎のファイルは生成されません。つまり、Zone.Identifier問題は解決します。
設定方法もとても簡単で、ファイルのプロパティを開いてチェックをOFFするだけです。
しかし、問題は複数のファイルがあった場合です。WindowsのGUIでは複数のファイルのプロパティでこのフラグのOFFができないのです。
しかたないので、以下のようなスクリプトを使ってフラグの一括解除を行います。
以下のコードをメモ帳に貼り付け、「ブロック一括解除.ps1」という名前で保存します。文字コードは「UTF-8 with BOM」で保存するのがポイント!
# --- 文字化け対策 ---
$OutputEncoding = [System.Text.Encoding]::UTF8
# --- ここから本体の処理 ---
Write-Host "このスクリプトが置かれているフォルダ内の全ファイルのブロックを解除します。" -ForegroundColor Cyan
Read-Host "続けるにはEnterキーを押してください..."
try {
# -Recurse でサブフォルダも含めて処理
$files = Get-ChildItem -LiteralPath . -Recurse -File
$count = $files.Count
if ($count -eq 0) {
Write-Host "処理対象のファイルが見つかりませんでした。" -ForegroundColor Yellow
} else {
Write-Host "$count 個のファイルを処理しています..." -ForegroundColor Yellow
$files | Unblock-File -ErrorAction Stop
Write-Host "処理が正常に完了しました。" -ForegroundColor Green
}
}
catch {
Write-Host "エラーが発生しました:" -ForegroundColor Red
Write-Host $_.Exception.Message -ForegroundColor Red
}
Read-Host "`n何かキーを押すとウィンドウを閉じます..."
使い方
- この
.ps1ファイルをブロック解除したいファイルがあるフォルダに置きます - ファイルを右クリックし、「PowerShell で実行」を選択すれば完了です
この操作を行った後にエクスプローラーでファイルを操作すれば、Zone.Identifier問題は発生しません。
(解決策2)WSL側で生成されてしまったZoneファイルを一括削除するシェルスクリプト
つぎの解決策はコピーしてしまった場合にZone.Identifierのついたファイルを削除するパターンです。
WSL内に大量の:Zone.Identifierファイルが生成されてしまった場合は、WSLのターミナルから直接削除するのが効率的です。
以下のコードを「delete_zone_files.sh」という名前で保存し、chmod +x delete_zone_files.shで実行権限を与えてから使います。
#!/bin/bash
echo "========================================"
echo " Zone.Identifier ファイル削除ツール"
echo "========================================"
echo ""
echo "このディレクトリ(サブディレクトリも含む)内の"
echo "すべての「:Zone.Identifier」ファイルを検索して削除します。"
echo ""
# まず対象ファイル数を確認
count=$(find . -name "*:Zone.Identifier" 2>/dev/null | wc -l)
if [ $count -eq 0 ]; then
echo "削除対象のファイルは見つかりませんでした。"
exit 0
fi
echo "削除対象: $count 個のファイル"
echo ""
read -p "実行しますか? (y/N): " confirm
if [[ "${confirm,,}" = "y" ]]; then
echo ""
echo "ファイルを削除しています..."
find . -name "*:Zone.Identifier" -delete 2>/dev/null
echo "✓ 処理が完了しました。"
else
echo "処理を中断しました。"
fi
使い方
- この
.shファイルを掃除したいフォルダに置きます - WSLのターミナルでそのフォルダに移動し、以下のコマンドを実行します。
$ chmod +x delete_zone_files.sh # 初回のみ $ ./delete_zone_files.sh
おわりに
Windows×WSLの連携は強力ですが、ファイルシステムの違いによって発生する課題がありました。 今回紹介した2つの解決法テクニックを活用すれば、ファイル操作はかなり楽になるのではないかと思います。
というか、Zone.Identifier問題はマジビビるのでやめてほしい機能です😨