Windows10下WSL Bash目录不自动刷新问题求助
这个问题我之前也碰到过,批量移动文件时每次都要重启WSL太折腾了!本质原因是WSL为了提升访问Windows文件系统的性能,会缓存目录结构和文件元信息,当你在Windows资源管理器里修改文件/文件夹时,WSL的缓存不会自动更新,所以执行ls看不到变化,甚至会提示文件不存在。下面给你几个可行的解决办法:
一、临时手动刷新缓存
如果只是偶尔遇到这个问题,不想改配置,可以执行这条命令强制释放缓存:
echo 3 | sudo tee /proc/sys/vm/drop_caches
执行完之后再跑ls -la,就能看到Windows端新增/修改的文件了。这条命令会清除页缓存、目录项和inode缓存,是临时生效的,下次遇到同样问题还得再跑一遍。
二、配置WSL自动同步(永久生效)
这个方法需要修改WSL的配置文件,让它实时或者低延迟同步Windows文件系统的变化,分WSL 1和WSL 2两种情况:
针对WSL 1
- 在Bash里编辑
/etc/wsl.conf文件(如果没有就新建一个):
sudo nano /etc/wsl.conf
- 把下面的内容粘贴进去:
[automount] options = "metadata,umask=0022,fmask=0133,cache=none"
cache=none会关闭WSL对Windows目录的缓存,让两边实时同步,代价是访问Windows文件系统的速度会略有下降,但日常使用基本感知不到。
针对WSL 2
WSL 2用的是虚拟机内的ext4文件系统,挂载Windows目录用的是9P协议,默认有1秒左右的缓存延迟。同样编辑/etc/wsl.conf:
sudo nano /etc/wsl.conf
粘贴以下内容:
[automount] options = "metadata,umask=0022,fmask=0133,cache=loose"
cache=loose是平衡性能和实时性的选项,缓存时间很短,基本能做到接近实时同步;如果追求完全实时,也可以把cache=loose改成cache=none,但性能损耗会大一点。
- 保存配置后,需要关闭并重启WSL才能生效:
在Windows的PowerShell或者CMD里执行:
wsl --shutdown
然后重新打开Cmder的Bash终端,之后Windows端修改文件后,WSL里马上就能用ls看到变化了。
三、小技巧:触发缓存刷新(不一定每次有效)
有时候可以通过切换目录的方式触发缓存更新,比如先回到父目录再切回来:
cd .. && cd SQL
这个方法偶尔管用,但可靠性不如前面两种,适合临时应急用。
附你提供的操作前后示例:
添加新文件前:
ls -la total 0 drwxrwxrwx 1 sili sili 4096 Jun 1 18:38 . drwxr-xr-x 1 sili sili 4096 Jun 1 18:38 .. -rw-rw-rw- 1 sili sili 0 Jun 1 18:37 info.php -rw-rw-rw- 1 sili sili 0 Jun 1 18:37 test.sql -rw-rw-rw- 1 sili sili 0 Jun 1 18:37 text.txr
在资源管理器中创建新元素后(未刷新时):
:~/SQL$ ls -la total 0 drwxrwxrwx 1 sili sili 4096 Jun 1 18:38 . drwxr-xr-x 1 sili sili 4096 Jun 1 18:38 .. -rw-rw-rw- 1 sili sili 0 Jun 1 18:37 info.php -rw-rw-rw- 1 sili sili 0 Jun 1 18:37 test.sql -rw-rw-rw- 1 sili sili 0 Jun 1 18:37 text.txr
内容的提问来源于stack exchange,提问作者Sili Jz

