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

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

我使用 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。

答案1

您真正需要做的是修复脚本,以便将 Windows 路径转换为 ​​Unix 路径。一种相对简单的方法是将路径分隔符排除在等式之外:您无需提供要复制的完整路径名,而是递归地遍历目录,在远程端创建目标目录并仅指定文件名而不是完整路径。 :)

但在达到这一点之前,您需要保护反斜杠免受 shell 的影响。您可以通过使用单引号引用来做到这一点(反斜杠被解释为双引号内的某些字符)。请特别注意,通配符位于引号之外,因此 shell 将其视为通配符而不是文字*: :)

rm -rv '.\'*

或者您可以通过转义反斜杠来做到这一点(这也可以在双引号中使用,但这里不需要双引号):

rm -rv .\\*

我建议,在使用通配符删除内容之前,您始终首先ls使用相同的参数运行,然后使用向上箭头调用最后一个命令,您可以在ls其中将rm.这样您就可以在删除文件之前查看文件列表,从而防止出现潜在的重大错误。 :) 我也非常喜欢在这种情况下使用-vwith 。rm

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

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

答案2

由于文件名包含转义字符\,因此您需要转义该转义字符。

rm .\\gitkeep .\\innerfile\\gitkeep
rmdir .\\innerfile 

将删除您的文件

答案3

如果其他一切都失败,您可以执行以下操作来删除名称中包含反斜杠或奇怪字符的文件和文件夹:

rm -iR *

上面的命令将启动删除您所在文件夹中所有内容的过程。但是,它会在删除每个文件或文件夹之前提示您:

rm: remove regular file `.\gitkeep? y
rm: remove regular file `.\innerfile\gitkeep'? y

您需要为要删除的每个文件或文件夹键入“y”并按 [Enter]。如果您遇到不想删除的文件或文件夹,请输入“n”并按 [Enter]。

如果系统仍然提示您输入所有剩余的文件和文件夹,但您已经删除了想要删除的内容,只需按以下组合键:

[Ctrl] + [c]

相关内容