如何删除或访问名称中带有反斜杠 \ 的文件?

Leg*_*ack 4 command-line shell filenames quoting

我在这里有一些文件,我使用 python 模块 pysftp 复制到这个 linux box:

[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
Run Code Online (Sandbox Code Playgroud)

它们是隐藏的,所以我仍在尝试弄清楚如何复制然后再将它们隐藏起来,但同时我想删除它们,但我无法删除。这里发生了什么?

我在 CentOS 7 上。

dan*_*uer 5

您真正需要做的是修复您的脚本,以便将 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'
Run Code Online (Sandbox Code Playgroud)