Ubuntu

無法從 Windows 10 Enterprise 上的 Ubuntu 子系統中刪除文件

  • February 16, 2022

這可能是錯誤的論壇,但無論如何我都會試一試。我在 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 中,並顯示為lsand git 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)命令將消失。

引用自:https://unix.stackexchange.com/questions/690680