在 unix find 命令的路径中使用通配符

在 unix find 命令的路径中使用通配符

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

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

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

Svr2$ echo $Pswd|ssh Svr1 /usr/local/bin/sudo -S find /path/*/foo/ -name "*20160208*"

错误信息是:

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

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

Svr2$ echo $Pswd|ssh Svr1 /usr/local/bin/sudo -S find /path/ -name "*20160208*"

我做错了什么?我认为我需要引用或转义部分字符串,但我就是想不通。

非常感谢。

答案1

由您的本地 shell扩展*。您应该引用您的论点

ssh Svr1 /usr/local/bin/sudo -S find '/path/*/foo/' -name "20160208"

答案2

正如@Matteo所说,您需要*从本地 shell 中退出。他在第一个例子中做到了这一点:

ssh Svr1 /usr/local/bin/sudo -S find '/path/*/foo/' -name "20160208"

另外,以下任一种方式都可以正常工作,因为单引号 ( '...') 和反斜杠 ( )会在您的本地 shell 中\“隐藏”通配符:*

ssh -t Svr1 /usr/local/bin/sudo 'find /path/*/foo/ -name *20160208'

或者

ssh -t Svr1 /usr/local/bin/sudo find /path/\*/foo/ -name \*20160208

附注:我已经添加了一个-t参数,ssh以便sudo有一个 tty 来询问我的密码,即很多在我看来,这比在命令行上输入密码要好。如果你必须输入密码sudo,我建议通过 进行输入,这样可以避免在命令行中输入密码,因为任何有权访问你的 shell 历史记录(包括和变体)的人都cat secret.txt | find ...可能看到密码。ps~/.history

相关内容