55

Using commands such as rsync and scp with ZSH I've run into trouble. Instead of the (normal) behaviour of giving me all matching files, it won't run and returns:

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

How can I fix this?

My .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

3 Answers 3

69

This is related with how ZSH manage globbing characters to generate filenames. By default, ZSH will generate the filenames and throw an error before executing the command if it founds no matches.

There are many ways to bypass this behavior, here are some of them:

  • The quickest is to enclose the globbing characters with quotes.
$ rsync -azP "user@server:~/*" ~/
  • For a permanent change, you'll have to add the following in your .zshrc file:
unsetopt nomatch

This will prevent ZSH to print an error when no match can be found.

  • Another possibility is to disable globbing for a particular command by using the noglob command modifier. By setting an alias in .zshrc for example:
alias scp='noglob scp'
7
  • Thanks! Never had to do that with bash.
    – Morgan
    Apr 18, 2013 at 6:36
  • @Morgan That's weird, actually. Without the quotes, Bash should expand the tilde before rsync ever sees it. Could it be that you were just using the same path for the home directory on both servers?
    – slhck
    Apr 18, 2013 at 6:52
  • @slhck No, he's right. zsh has some more options to configure wildcards so this behavior can be changed in the zshrc.
    – Spack
    Apr 18, 2013 at 7:30
  • 1
    @sa125 I've edited my answer.
    – Spack
    Apr 18, 2013 at 18:09
  • 1
    @slhck: bash only expands a tilde when it begins a word, or is the first character following a : or the first = in a variable assignment. Otherwise, it is treated literally.
    – chepner
    Apr 22, 2013 at 18:08
11

I have been using zpretzo for quite a few months and also experienced this issue. I came across a neat and useful solution if you don't want to make any changes: simply prepend backslash to the command.

~/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

I hope this helps!

4
  • Great solution!!
    – yorch
    Mar 28, 2017 at 0:59
  • Perfect, this worked great for me on OSX!
    – sMyles
    Nov 30, 2017 at 19:33
  • 3
    Awesome!! But any reason why/how this works? Apr 5, 2019 at 10:17
  • @KannanRamamoorthy because zprezto creates an alias for find > alias find find='noglob find' which makes noglob option active 🤦‍♂️ If you prepend with ` it will ignore this alias. You can unset this in ~/.zprezto/modules/utility/init.zsh` Dec 5, 2023 at 11:38
8

This solves your problem without having to manually quote the URLs

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)'
4
  • And this goes in .zshrc?
    – Morgan
    Apr 18, 2013 at 15:31
  • yes, this goes into your zsh configuration. FWIW, just start a new shell (zsh -f for a canonical shell conf), copy&paste the commands in your shell, and type (or paste) your rsync command. You'll see the magic at work ;-) (special chars at the URL will get automatically quoted)
    – Francisco
    Apr 19, 2013 at 11:33
  • you should accept my answer :-P this is a lot better than quoting or turning off globing for whole command.
    – Francisco
    Apr 19, 2013 at 13:28
  • This works very nicely, I like the freedom of selecting which commands should be used without previous globbing. The * changing automagically into \* is truly impressive :-) Feb 14 at 8:41

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .