Shell

如何刪除或訪問名稱中帶有反斜杠 的文件?

  • December 30, 2020

我在這裡有一些文件,我使用 python 模組 pysftp 複製到這個 linux 機器上:

[jm@spartan tf]$ ls -la
total 0
drwxrwxrwx. 3 jm jm  69 Aug 14 13:50 .
drwxrwxrwt. 9 root    root    238 Aug 14 13:49 ..
-rwxrwxrwx. 1 jm jm   0 Aug 14 13:49 .\gitkeep
drwxrwxrwx. 2 jm jm   6 Aug 14 13:50 .\innerfile
-rwxrwxrwx. 1 jm jm   0 Aug 14 13:50 .\innerfile\gitkeep
[jm@spartan tf]$ rm .\gitkeep
rm: cannot remove ‘.gitkeep’: No such file or directory

它們是隱藏的,所以我仍在嘗試弄清楚如何複製然後將它們隱藏起來,但同時我想刪除它們,但我做不到。這裡發生了什麼?

我在 CentOS 7 上。

您真正需要做的是修復您的腳本,以便將 Windows 路徑轉換為 Unix 路徑。一種相對簡單的方法是將路徑分隔符排除在等式之外:不是提供要複製的完整路徑名,而是遞歸遍歷目錄,在遠端端創建目標目錄並僅指定文件名而不是完整路徑。:)

但在達到這一點之前,您需要保護反斜杠免受 shell 的影響。您可以通過使用單引號引用來做到這一點(反斜杠被解釋為雙引號內的某些字元)。請特別注意,萬用字元在引號之外,因此 shell 將其視為萬用字元而不是文字*: :)

rm -rv '.\'*

或者您可以通過轉義反斜杠來做到這一點(這也可以在雙引號中使用,但這裡不需要雙引號):

rm -rv .\\*

我建議,在使用萬用字元刪除內容之前,您始終首先ls使用相同的參數執行,然後使用向上箭頭呼叫最後一個命令,您可以在其中lsrm. 這樣您就可以在文件被刪除之前查看文件列表,從而防止出現潛在的大錯誤。:) 在這種情況下,我也非常喜歡使用-vwith rm

sauer@lightning:/tmp> ls -vr .\\*
.\innerfile\gitkeep  .\gitkeep

.\innerfile:
sauer@lightning:/tmp> rm -vr .\\*
removed '.\gitkeep'
removed directory '.\innerfile'
removed '.\innerfile\gitkeep'

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