126

Why can't I copy with scp when I'm using * characters in the path?

scp SERVERNAME:/DIR/* .

What configuration does SCP need in order to allow * in the path?

UPDATE: the problem is not on server side; pscp is trying to use SCPv1, and that's why the error message:

scp commandline and error message regarding a file called *

112

You need to pass a literal escape to scp to avoid the remote machine treating * as a glob (notice that it is doubly quoted):

scp 'SERVERNAME:/DIR/\*' .
  • 34
    You either need quotes, or a backslash before the star, not both. And scp is not the one expanding it, the shell is. – Patrick Dec 23 '11 at 4:39
  • @Patrick That's not correct, scp expands the glob, even if your shell doesn't (you can try it for yourself). There are two stages: stopping your shell from expanding the glob (which is not necessary because it should have nothing to expand the glob to, and thus will remain intact), and telling scp that this character is not a glob. If it was your shell expanding the glob you would not have to escape it at all. – Chris Down Dec 23 '11 at 13:29
  • 3
    Have you tried it? I just did, works exactly as I described (quoting and escaping causes failure). User1274964 even confirms the behavior in his answer. touch /tmp/abcd.1234; scp 'localhost:/tmp/abcd.\*' ./: scp: /tmp/abcd.*: No such file or directory – Patrick Dec 7 '13 at 1:00
  • 2
    @Patrick The question is about using a literal asterisk, ie, avoiding globbing altogether, not about how to glob on the remote. – Chris Down Dec 8 '13 at 20:57
  • 2
    Actually the question is about getting pscp on the client side to allow remote globbing. – Patrick Dec 8 '13 at 22:08
45

I found Patrick's advice to be correct, although Chris's answer got me on the right track. Use quotes and then you don't need the backslash before the asterisk.

scp 'SERVERNAME:/tmp/file_num\*' .

scp: /tmp/file_num*.csv: No such file or directory

scp 'SERVERNAME:/tmp/file_num*' .

judgments_for_job_171642.csv 100% 32KB 32.0KB/s 00:00
judgments_for_job_172394.csv 100% 548KB 182.6KB/s 00:03

  • 4
    Right, because this means that you want to glob on the remote. The question is about how to stop globbing on the remote (to get a literal *), not about how to glob on the remote only. – Chris Down Dec 8 '13 at 20:57
  • 1
    @ChrisDown. No. The user wants the wildcard not expanded on the host, and does want it expanded on the remote, to allow it to match multiple files there. None of the files returned have a literal '*' in them. Did you mean "stop globbing on the host "? – Tim Bird Sep 7 '16 at 19:38
0

For me it works differently in bash and in c-shell. Don't ask why I use c-shell. In bash I don't need '' - in c-shell I do. So it seems they handle the globs differently in different linux versions.

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.