当前位置:首页 > 大白菜资讯 > WSL文件能直接拖吗?子系统与Windows互传文件的方法
WSL文件能直接拖吗?子系统与Windows互传文件的方法
在 WSL 里编译好的文件,想拖到桌面却拖不动,复制粘贴也失灵。两个系统其实是通的,只是入口不在你以为的地方。
一、最省事的一条:在资源管理器里直接访问 Linux 盘
打开资源管理器,在地址栏输入 \\wsl$ 回车(Win10 20H2 之后也可以试 \\wsl.localhost),会列出已安装的所有发行版。点进去就是那个系统的根目录,/home/用户名 对应到你的家目录,可以直接复制、粘贴、拖拽。
进去之后建议右键左侧导航栏「固定到快速访问」,以后一键进入。也可以把它映射成网络驱动器:右键「此电脑」→「映射网络驱动器」,文件夹填 \\wsl$\Ubuntu\home,勾选「登录时重新连接」,之后在「此电脑」里就有一个 Z 盘。
这条通道是双向的,但底层走的是 9P 协议,大量小文件操作会很慢。复制几万个文件的 node_modules 或 .git 目录,速度能慢到不可接受,那种场景要用下面的命令方式。
二、命令方式一:从 Windows 往 WSL 拷
WSL 里访问 Windows 盘符的路径固定是 /mnt/c、/mnt/d,注意是正斜杠、盘符小写。在 WSL 终端里执行:
cp /mnt/c/Users/你的用户名/Desktop/report.pdf ~/work/
反方向就是 cp ~/work/out.tar.gz /mnt/d/backup/。带 -r 复制目录,带 -v 看进度,带 -p 保留时间戳。文件多的时候用 rsync -av --progress 源 目标 更稳,中断了还能续。
在 Windows 的 PowerShell 里也能直接调 WSL 命令,格式是 wsl cp /mnt/c/... ~/...。反过来在 WSL 里调 Windows 程序,直接写 notepad.exe 文件名 或者 explorer.exe .,后者会用资源管理器打开当前 Linux 目录,非常顺手。

三、命令方式二:从资源管理器拖到 WSL 终端
Windows 终端和 VS Code 的集成终端都支持拖拽。把文件从资源管理器拖进 WSL 终端窗口,它会自动把路径粘贴成 /mnt/c/... 的形式,然后你在前面补一个 cp 加目标目录即可。
拖多个文件时,终端会把它们用空格连起来,路径里带空格的话会自动加引号,不用手动处理。如果拖进去只出现文件名没有路径,说明当前用的是老版控制台,换 Windows Terminal 就好。
VS Code 更直接:装 WSL 扩展,按 Ctrl + Shift + P 输入 WSL: Connect to WSL,连上之后左侧资源管理器就是 Linux 文件树,右键「上传」或直接把 Windows 文件拖进编辑器窗口,就落在 Linux 侧的当前目录。
四、剪贴板:文本双向同步,图片要绕一下
文本复制粘贴默认就是通的:在 Windows 里 Ctrl + C 一段文字,WSL 里 Ctrl + Shift + V 就能粘上。反过来在 WSL 里选中文字即复制,Windows 里直接粘。如果失效,检查终端设置里「使用 Ctrl+Shift+C/V 作为复制粘贴」是否被改过。
图形界面程序(WSLg)里的复制粘贴也走同一套。用 wsl --update 把 WSL 升到最新版,剪贴板桥接会更稳;老版本在跑 GUI 程序时经常出现「粘进去是空的」。
图片不能直接粘。可行的办法是把图片存成文件再拷,或者在 WSL 里装 xclip:sudo apt install xclip,然后 xclip -selection clipboard -t image/png -o > /tmp/a.png 把剪贴板里的图取出来。

五、权限、换行符和路径写错的坑
在 /mnt/c 下执行 chmod 会提示「操作不允许」,这是正常的:Windows 的 NTFS 不支持 Linux 权限位。需要保留权限的文件(比如 ssh 私钥、可执行脚本),必须放在 Linux 自己的文件系统里,也就是 ~/ 下,而不是 /mnt/c。
换行符是另一个高频问题。Windows 用 CRLF,Linux 用 LF,脚本从 Windows 拷进 WSL 后执行会报 bad interpreter: /bin/bash^M。修复命令:sed -i 's/\r$//' 脚本.sh,或者 dos2unix 脚本.sh(没有就 sudo apt install dos2unix)。Git 用户可以在 git config --global core.autocrlf input 里从源头规避。
路径大小写也要注意。Windows 不区分大小写,Linux 严格区分,Desktop 和 desktop 是两个不同的目录。从 Windows 拷过去的脚本里如果写死了 C:\Users,在 WSL 里会直接找不到,改成 /mnt/c/Users 并注意大小写。
性能方面有个实用规则:项目代码放 Linux 侧(~/projects),用 VS Code 远程连进去开发,热重载快;只把需要交付的产物拷到 Windows 侧。/mnt/c 下跑 npm install 可能要几分钟,放到 ~/ 下通常几十秒。

六、常见问题
输入 \\wsl$ 打不开,提示找不到网络路径?先确认 WSL 正在运行(wsl -l -v 看状态),再执行 wsl --shutdown 后重启一次。仍不行就在服务里检查 LxssManager 是否被禁用。
拖进终端的文件路径带一堆引号?那是路径里有空格或中文,属于正常转义,直接执行即可,不用手动删引号。
从 WSL 拷到 Windows 的文件变成只读?权限位映射导致的,在 Windows 侧右键属性取消「只读」,或者拷之前 chmod 644。
日常就用 \\wsl$ 那个入口,固定到快速访问最省事。要跑构建的项目放 Linux 侧,别放在 /mnt/c 里硬扛。

