在zsh命令中使用通配符


39

使用命令如rsyncscpZSH我碰到的麻烦。它不会运行并返回:不是给我所有匹配文件的(正常)行为,而是:

  ~  rsync -azP user@server:~/* ~/
zsh: no matches found: user@server:~/*

我怎样才能解决这个问题?

我的 .zshrc

ZSH=$HOME/.oh-my-zsh
ZSH_THEME="robbyrussell"
plugins=(git brew)
source $ZSH/oh-my-zsh.sh
export PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/usr/local/sbin

Answers:


50

这与ZSH如何管理通配符以生成文件名有关。默认情况下,如果ZSH未找到匹配项,它将在执行命令之前生成文件名并抛出错误。

有很多方法可以绕过此行为,以下是其中一些:

  • 最快的方法是用glob括起来。
$ rsync -azP "user@server:~/*" ~/
  • 要进行永久更改,您必须在.zshrc文件中添加以下内容:
unsetopt nomatch

当找不到匹配项时,这将防止ZSH打印错误。

  • 另一种可能性是通过使用noglob命令修饰符来禁用特定命令的globbing 。.zshrc例如,通过设置别名:
alias scp='noglob scp'

谢谢!从来不需要这样做bash
Morgan

@Morgan实际上,这很奇怪。没有引号,Bash应该在rsync看到波浪号之前就将其展开。难道您只是在两台服务器上使用相同的主目录路径?
slhck

@slhck不,他是对的。zsh具有更多配置通配符的选项,因此可以在zshrc中更改此行为。
Spack

1
@ sa125我已经编辑了答案。
Spack

1
@slhck:bash仅当波浪号开始于单词时才扩展波浪号,或者是变量赋值中:第一个或第二个字符之后的第一个字符=。否则,将按字面意义对待它。
chepner

8

我使用zpretzo已经有好几个月了,并且也遇到了这个问题。如果您不想进行任何更改,我遇到了一个简洁实用的解决方案:只需在命令前加上反斜杠即可。

~/p/b/a/files ❯❯❯ scp *.* myserver@host:~/
*.*: No such file or directory

~/p/b/a/files ❯❯❯ \scp *.* myserver@host:~/
jquery.min.js                              100%   93KB  92.6KB/s   00:00
json2.min.js                               100%   3377   3.3KB/s   00:00

我希望这有帮助!


很好的解决方案!!
yorch '17

完美,这对我在OSX上非常有用!
sMyles

太棒了!! 但是为什么/如何运作呢?
Kannan Ramamoorthy

3

这样可以解决您的问题,而无需手动引用URL

autoload -U url-quote-magic  
zle -N self-insert url-quote-magic

# sort it out for SCP
some_remote_commands=(scp rsync)
zstyle -e :urlglobber url-other-schema \
  '[[ $some_remote_commands[(i)$words[1]] -le ${#some_remote_commands} ]] && reply=("*") || reply=(http https ftp)'

这在.zshrc中进行?
Morgan

是的,这进入您的zsh配置。FWIW,只需启动一个新的shell(zsh -f用于规范的shell conf),将命令复制并粘贴到您的shell中,然后键入(或粘贴)您的rsync命令。您会看到工作中的魔力;-)(URL上的特殊字符将被自动引用)
Francisco

您应该接受我的回答:-P比引用或关闭全局命令要好得多。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.