Unix 发现在 ssh 时路径中不能使用通配符

Unix 发现在 ssh 时路径中不能使用通配符

此命令在查找路径中带有 *,在本地服务器上可以正常工作

Svr1$ find /path/*/foo/ -name "*20160208"

当我从另一台服务器远程尝试此操作时,它不起作用

Svr2$ ssh Svr1 find '/path/*/foo/' -name "*20160208*"

错误信息是:

find: stat() error /path/*/foo/: No such file or directory

但是,如果我更改搜索路径以避免使用 *,它就可以正常工作。像这样:

Svr2$ ssh Svr1 find '/path/' -name "*20160208*"

知道我做错了什么吗?

非常感谢。

答案1

你的问题是寻找命令不会插入/解释目录 glob(它必须在其下查找的目录列表),它只会将模式插入为必须匹配的 glob。解释目录 glob 的是您运行的 shell 本身寻找里面。当你跑步时寻找通过 ssh,没有 shell 可以执行这项工作。

幸运的是,没有规则禁止通过 ssh 运行 shell,并让该 shell 运行你的命令,插入所有必需的内容,并保留其余的通配符寻找本身。

类似于我在我的机器上使用的东西:

ssh lx@localhost "bash -c '/usr/bin/find /tmp/d* -name \"f*\" '"
lx@localhost's password:
/tmp/d1/f1
/tmp/d2/f2

答案2

您编写的方式是在本地主机上进行评估,这通常是您不想要的。您需要转义序列以使其在其他主机上进行评估。类似这样的操作应该可以做到这一点:

Svr2$ ssh Svr1 "find /path/*/foo/ -name \"*20160208*\""

相关内容