我正在Windows上的Ubuntu上使用Bash或Windows子系统中的另一个Linux发行版(用于Linux),并且已经lxss
使用Windows编辑器在目录中编辑了Linux文件。
现在,每当我或某个程序尝试从Linux访问它时,我都会收到一个错误“输入/输出错误”,或者即使我可以在File Explorer中看到该文件,文件也完全消失了。
cat abc
cat: abc: Input/output error
为什么会这样呢?我该如何解决?将来如何避免呢?
我正在Windows上的Ubuntu上使用Bash或Windows子系统中的另一个Linux发行版(用于Linux),并且已经lxss
使用Windows编辑器在目录中编辑了Linux文件。
现在,每当我或某个程序尝试从Linux访问它时,我都会收到一个错误“输入/输出错误”,或者即使我可以在File Explorer中看到该文件,文件也完全消失了。
cat abc
cat: abc: Input/output error
为什么会这样呢?我该如何解决?将来如何避免呢?
Answers:
由于常规的Unix文件系统与Windows文件系统的工作方式不同,因此WSL 在用于表示它们的Windows文件的扩展属性中存储了有关Linux特定文件属性的额外信息。普通的Windows程序不知道这些属性,并且在编辑文件时不会保留它们。发生这种情况时,有关文件的重要信息将丢失。
当WSL尝试读取文件,但找不到所需的属性时,则会报告错误,就像本地文件系统损坏时会发生的情况一样。如果从头开始看不到文件的属性,则该文件将被视为不存在,并且不会显示在文件列表中。
在任何情况下,请勿使用Windows应用程序,工具,脚本,控制台等创建和/或修改Linux文件。
从Windows创建/更改Linux文件可能会导致数据损坏和/或损坏Linux环境,从而要求您卸载并重新安装发行版!
因此(更大,更红,带有更多下划线)。“ Linux文件”表示lxss
目录中的所有内容。您可以通过/mnt/c/...
DrvFS文件系统从Linux内部修改常规Windows文件,但不能相反。
然而,1903年的Windows 10版本引入了新的机制,并允许文件安全地从Windows中进行编辑,只要你去了解它的正确方法。这无助于解决已经损坏的文件的问题,但将来可以避免。
如果您已经编辑过文件,但现在无法访问它,则仍然可以从Windows本身读取内容并以这种方式还原文件。
为此,您需要:
AppData\Local\lxss
使用文件资源管理器导航回到文件所在目录内的位置,然后将文件移至驱动器上的其他位置,例如桌面。ls
检查。检查您移出的文件:运行
cat /mnt/c/Users/.../Desktop/abc
查看文件的原始内容。
如果到目前为止一切正常,您现在可以将该文件复制回您期望的位置:
cp /mnt/c/Users/.../Desktop/abc ~/alphabet/abc
该cp
命令将使WSL恢复文件上必要的隐藏属性。
这些说明适用于常规数据文件,但是如果它是重要的操作系统文件,则可能需要完全重新安装。对于许多非关键程序,从Windows删除损坏的文件并使用程序包管理器重新安装该程序就足够了。一旦文件损坏,您将无法从Linux内部删除该文件。
切勿lxss
从Windows 操作目录中的任何文件。代替:
如果您有要从Windows和Linux都访问的文件,请将其存储在目录之外的lxss
Windows系统上的任何其他位置。您可以使用自动DrvFS互操作性从Linux打开Windows文件:该/mnt/c
目录包含C:驱动器中的所有文件,并且可以从Linux读取和写入它们。
从1903 Windows版本(2019年3月)开始,WSL 包括一个特殊的文件服务器,使您的文件可用于所有Windows应用程序。如果你跑
explorer.exe .
然后“文件资源管理器”将打开并显示当前Linux目录-您可以在该窗口内外复制文件,也可以使用任何应用程序对其进行编辑。目录路径将类似于\\wsl$\Ubuntu\var\www
:该\\wsl$\
部分通过替代的安全路径发送文件访问权限。
如果可以的话,这将是前进的最佳途径(有时是上面的要点)。对于旧版本,请继续阅读。
如果需要将文件放在特定位置(例如配置文件),并且要在Windows中进行编辑,则可以从Linux内部建立到该文件或目录的实际位置的符号链接:
ln -s /mnt/c/.../abc ~/.config/xyz/abc
只要文件在Linux中不需要具有任何特定的权限或属性(如可执行文件或SSH密钥),该文件便会起作用。
或者,也许更好,使用终端内的Linux编辑器编辑Linux文件。nano
,,vim
和emacs
,尽管它们都有自己的怪癖,但它们在WSL下都可以随时使用并且运行良好。
如果必须使用Windows程序编辑文件,则没有足够新的Windows版本,也不能使其成为符号链接,请在其他位置进行复制以进行编辑,然后再将其复制回来/mnt/c
,就像请修复以上问题,或使用版本控制在多个位置同步您的编辑。
通过一些试验,普通的记事本似乎确实保留了必要的属性,但是它不理解Unix行尾,因此您很可能自己破坏内容,并且在任何情况下我都不会依赖该行为。由于这是一个明显不受支持且未记录的操作,因此任何基于Windows的编辑器都不太可能可靠。