我删除带有通配符的文件
rm /home/files/*.csv
但是当我尝试通过 ssh 在远程计算机上运行命令时
ssh user@ip 'rm /home/files/*.csv'
它尝试删除*.csv
文件,但我收到错误
rm: cannot remove '/home/files/*.csv': No such file or directory
rm
发送通配符的正确语法是什么ssh
?
两台机器都有 Ubuntu 20.04 和标准程序(bash、ssh 等)。
答案1
您已经使用了正确的语法。很可能没有与该模式匹配的文件名(事实上,这个已在评论中得到证实)。在这种情况下,您的 shell 不会展开该模式,并尝试将rm
其作为参数进行调用。
如果不使用ssh
本地,您也会遇到同样的问题:
$ rm /tmp/wont*match
rm: cannot remove '/tmp/wont*match': No such file or directory
切线讨论:
某些 shell(例如zsh
默认的 shell)将不匹配的通配模式视为错误,这意味着如果模式与任何内容都不匹配,它甚至不会运行该命令:
$ rm /tmp/wont*match
zsh: no matches found: /tmp/wont*match
使用 shell 选项可以使shellbash
以相同的方式进行操作failglob
。在以下示例中,rm
从未被调用:
$ shopt -s failglob
$ rm /tmp/wont*match
bash: no match: /tmp/wont*match
您可以在通话中使用它,ssh
如下所示:
ssh user@ip 'bash -O failglob -c "rm /home/files/*.csv"'
显然,您可以使用rm -f
静默有关无法找到您要删除的文件名的诊断消息(如果这是您实际询问的内容),但这也会掩盖任何退出状态rm
如果您想确保该命令确实删除了某些内容。
答案2
您可以rm
使用其-f
标志使其静音,这告诉它不要担心删除它找不到的文件
ssh user@ip 'rm -f home/files/*.csv'