無法從 Windows 10 Enterprise 上的 Ubuntu 子系統中刪除文件
這可能是錯誤的論壇,但無論如何我都會試一試。我在 Windows 10 Enterprise 中執行 ubuntu 子系統:
root@hostname:/directory/stuff# cat /etc/*release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=20.04 DISTRIB_CODENAME=focal DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"
該文件位於 repo 中,並顯示為
ls
andgit status
,但不在 GUI 中(在資源管理器視圖選項中檢查了“隱藏文件”)或dir
在 cmd 中顯示。這是一個“隱藏”文件,當您打開 Excel 電子表格時會顯示 - 只有電子表格被關閉。即使我再次打開和關閉,它也無法移除。chmod
我可以用and修改所有權和權限chown
,這很奇怪,我不能做任何其他事情:root@hostname:/directory/stuff# ll total 14600 ... -rwxrwxrwx 0 my_name my_name 165 Feb 14 13:25 '~$Copy of Full Compilation of Databases for Audit.xlsx'* root@hostname:/directory/stuff# chown root: ~\$Copy\ of\ Full\ Compilation\ of\ Databases\ for\ Audit.xlsx root@hostname:/directory/stuff# ll total 14600 ... -rwxrwxrwx 0 root root 165 Feb 14 13:25 '~$Copy of Full Compilation of Databases for Audit.xlsx'*
我試過了:
root@hostname:/directory/stuff# ls -i ... 1688849860795414 '~$Copy of Full Compilation of Databases for Audit.xlsx' .... root@hostname:/directory/stuff# find . -inum 1688849860795414 -exec rm {} \; rm: cannot remove './~$Copy of Full Compilation of Databases for Audit.xlsx': No such file or directory .... root@hostname:/directory/stuff# rm -i -- ./* ... rm: remove regular file './~$Copy of Full Compilation of Databases for Audit.xlsx'? y rm: cannot remove './~$Copy of Full Compilation of Databases for Audit.xlsx': No such file or directory .... root@hostname:/directory/stuff# ls -1b ... ~$Copy\ of\ Full\ Compilation\ of\ Databases\ for\ Audit.xlsx root@hostname:/directory/stuff# rm ~$Copy\ of\ Full\ Compilation\ of\ Databases\ for\ Audit.xlsx rm: cannot remove '~ of Full Compilation of Databases for Audit.xlsx': No such file or directory .... root@hostname:/directory/stuff# mv ~\$Copy\ of\ Full\ Compilation\ of\ Databases\ for\ Audit.xlsx just_a_file.xlsx mv: cannot move '~$Copy of Full Compilation of Databases for Audit.xlsx' to 'just_a_file.xlsx': No such file or directory
任何人都可以添加到這將是偉大的!
更正: 在上面,我說我看不到來自CMD的文件
dir
,但我可以dir /a
- 所以 windows 在某種程度上可以看到它。但是,即使從 CMD 中,我仍然無法刪除它(奇怪的是它在此處完成製表符)。C:\Users\me\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\rootfs\directory\stuff>dir /a Volume in drive C has no label. ... 2022-02-14 13:25 165 ~$Copy of Full Compilation of Databases for Audit.xlsx ... C:\Users\me\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\rootfs\directory\stuff>del "~$Copy of Full Compilation of Databases for Audit.xlsx" Could Not Find C:\Users\me\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\rootfs\directory\stuff\~$Copy of Full Compilation of Databases for Audit.xlsx
我不確定哪些星星對齊,但今天早上我能夠刪除該文件。可能是因為我關閉了電腦帶回家,然後鎖被清除了,但我不知道我是否能確定。為了刪除它,我只是將 repo 拉到了適當的 Linux 環境中——Linux Mint 在同一台機器上的 VM 上執行——不是說它必須是 VM——或者在有問題的同一台 Windows 電腦上,但它是,所以你去。因為它是一個合適的 Linux 環境,所以我可以在 nemo 中刪除它。我本可以發誓昨天同步時這個特定的文件沒有被拉下,但今天它做到了,我刪除了這個小蟲子。當我送出並推送,然後拉入 Windows 機器上的 Ubuntu 子系統時,該文件被刪除:
dir/to/file > master > git pull 01239e91..452981f2 master -> origin/master Updating 01239e91..452981f2 Fast-forward dir/to/file/All-Production.vsdx | Bin 1101177 -> 1100811 bytes dir/to/file/~$Copy of Full Compilation of Databases for Audit.xlsx | Bin 0 -> 165 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 dir/to/file/~$Copy of Full Compilation of Databases for Audit.xlsx .. ### I deleted file in GIU (nemo) at this point ### .. dir/to/file > master > git status On branch master Your branch is up to date with 'origin/master'. Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) deleted: ~$Copy of Full Compilation of Databases for Audit.xlsx .. dir/to/file > master > git rm \~\$Copy\ of\ Full\ Compilation\ of\ Databases\ for\ Audit.xlsx rm 'dir/to/file/~$Copy of Full Compilation of Databases for Audit.xlsx' dir/to/file > master > git commit -a -m "fixing stupborn ghost " [master b543cc14] fixing stupborn ghost 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 dir/to/file/~$Copy of Full Compilation of Databases for Audit.xlsx dir/to/file > master > git push Enumerating objects: 9, done. Counting objects: 100% (9/9), done. Delta compression using up to 6 threads Compressing objects: 100% (5/5), done. Writing objects: 100% (5/5), 425 bytes | 425.00 KiB/s, done. Total 5 (delta 4), reused 0 (delta 0) remote: Resolving deltas: 100% (4/4), completed with 4 local objects. To github.com:my/repo.git 452981f2..b543cc14 master -> master .... me@wind_mach directory $ git pull Enter passphrase for key '/home/me/.ssh/id_rsa': ... 452981f2..b543cc14 master -> origin/master Updating 452981f2..b543cc14 Fast-forward dir/to/file/~$Copy of Full Compilation of Databases for Audit.xlsx | Bin 165 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 Dir/to/file/~$Copy of Full Compilation of Databases for Audit.xlsx
所以你有它。
您很可能有某種 WSL 文件系統損壞。我不會這麼快就得出這個結論,但是:
- 很明顯,您使用的是 WSL 版本 1,因為您可以
rootfs
從 CMD 中看到目錄。這在 WSL2 中是不可能的,因為它將其文件系統儲存在一個虛擬磁碟 (ext4.vhdx
) 中,該磁槃無法從 CMD 訪問。- 您正在
rootfs
從 Windows 應用程序(例如 CMD)訪問該目錄。如果您這樣做是為了刪除該文件,我擔心您使用相同的路徑從 Excel 創建或編輯文件。- 已知訪問該目錄會導致 WSL 文件系統損壞。從該頁面引用:
在任何情況下,都不要
%LOCALAPPDATA%
使用 Windows 應用程序、工具、腳本、控制台等訪問、創建和/或修改文件夾內的 Linux 文件。使用某些 Windows 工具打開文件可能會讀取鎖定打開的文件和/或文件夾,從而阻止更新文件內容和/或元數據,從而導致文件/文件夾損壞。
從 Windows 創建/更改您的 Appdata 文件夾中的 Linux 文件可能會導致數據損壞和/或損壞您的 Linux 環境,需要您解除安裝並重新安裝您的發行版!
這聽起來像你正在經歷的。
(旁注,儘管它不適用於您的情況:無論位置如何,說“不要訪問 … Linux 文件
rootfs
”更準確,因為您可以將 WSL1 實例放置在AppData
.)如果在任何時候,您使用 Excel、Windows 版 Git 或任何其他 Windows 工具訪問了該路徑,則很容易導致您看到的鎖定。
請注意,如果您的案例(和電腦)支持使用 WSL2,則 WSL2 的文件系統更加健壯。
另請注意,正如 Microsoft 部落格所述,您可以從 Windows 訪問 WSL 文件。只是您需要使用
\\wsl$\<distroname>
路徑才能安全地執行此操作。對於“建議的解決方案”,我將從幾天前在 Ask Ubuntu 上提供的類似問題的答案中複製/粘貼,儘管我從未收到該海報關於他們是否成功恢復的回复使用這些說明:
潛在的解決方案:
我假設您已重新啟動 PC,但如果沒有,請嘗試以防萬一,以確保已釋放任何搖桿/鎖。它的工作機會相對較小,但值得一試。
如果這不起作用,我會推薦以下方法來嘗試修復 WSL1 實例。
wsl --export
基本上通過/往返 WSL1 實例wsl --import
。此過程執行的tar
往返可能(希望)在歸檔或取消歸檔時刪除損壞的文件(或至少鎖定)。從 PowerShell:
# Confirm the distribution name wsl -l -v # Distribution name may be "Ubuntu" or "Ubuntu-20.04" - Adjust the following lines accordingly: wsl --shutdown cd ~\Documents mkdir WSL\images mkdir WSL\instances\UbuntuRecovery wsl --export Ubuntu WSL\images\ubuntu.tar wsl --import UbuntuRecovery WSL\instances\UbuntuRecovery WSL\images\ubuntu.tar --version 1 wsl -d UbuntuRecovery
查看該文件在該新實例中是否已消失或可刪除。
如果是這樣,並且如果在新實例中其他一切看起來都不錯,那麼:
- 根據此答案
/etc/wsl.conf
通過文件設置該實例中的預設使用者名。- 退出實例
- 同樣,來自 PowerShell:
wsl --terminate UbuntuRecovery wsl --set-default UbuntuRecovery
wsl
無論何時執行,新實例都將是預設實例。最後,使用以下命令刪除原始損壞的實例:
wsl --unregister Ubuntu
重要提示:這是一種破壞性操作。確保一切都按預期工作。從好的方面來說,我們已經進行了備份……
您還可以解除安裝當時從商店安裝的 Ubuntu“應用程序”。
您將通過
wsl
(如果您還沒有)或 Windows 終端啟動,因為ubuntu.exe
(或ubuntu2004.exe
)命令將消失。