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 上。
您真正需要做的是修复您的脚本,以便将 Windows 路径转换为 Unix 路径。一种相对简单的方法是将路径分隔符排除在外:不是提供完整的路径名进行复制,而是递归遍历目录,在远程端创建目标目录并仅指定文件名而不是完整路径。:)
但是在达到这一点之前,您需要保护反斜杠免受 shell 的影响。您可以通过使用单引号引用来做到这一点(反斜杠被解释为双引号内的某些字符)。请特别注意通配符在引号之外,因此 shell 将其视为通配符而不是文字*
: :)
rm -rv '.\'*
或者你可以通过转义反斜杠来做到这一点(这也适用于双引号,但这里不需要双引号):
rm -rv .\\*
我建议,在使用通配符删除内容之前,始终首先ls
使用相同的参数运行,然后使用向上箭头调用最后一个命令,您可以在其中ls
将rm
. 这样您就可以在删除文件之前查看文件列表,从而防止出现潜在的大错误。:) 我也非常喜欢在这种情况下使用-v
with 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)