我正在尝试在 ksh 中复制所有不以字母“a”开头的文件。
从源机器复制到目标机器工作正常:
scp -p !(a*) user@machine:/path/directory/.
但是,如果我在目标服务器上并想从源服务器复制,则失败:
scp -p user@machine:/path/!(a*) .
有任何想法吗?
Sup*_*gic 29
我同意冯布兰德。Globing 由您正在运行的 shell 处理。因此scp user@machine:/path/*会将 /path/* 扩展到 LOCAL /path/* 中的文件,而不是在远程机器上。
然而,只是为了咧嘴笑,我试过:
scp "user@machine:/path/[regex here]" .
Run Code Online (Sandbox Code Playgroud)
并且......它奏效了。试试那个。注意引号。非常有必要。让我们知道。
注意:远程机器上的用户帐户可能默认使用与您不同的 shell 程序,因此通配符扩展规则可能不同,所以请注意。
传递给的远程名称scp实际上被解释为远程端以空格分隔的模式列表。当您尝试复制名称包含空格的文件时,这通常会很麻烦,但在这里它很有用:scp -p 'user@machine:/path/a*' .将复制名称以a.
如果您引用该模式,以便远程而不是本地解释它,那么您的命令将起作用,前提是您通过了另一个障碍。该模式!(a*)不是基本的 shell 模式,而是 ksh 扩展(如果设置适当的选项,bash 和 zsh 也支持)。因此,只有当您的远程 shell 是 ksh 时,这才有效,而如果它是其他 shell 且您exec ksh来自.profile或类似的 shell,则此方法无效。
除非您处于某种受限制或古老的环境中,否则最简单的方法就是忘记scp. 您希望远程文件像本地文件一样工作,因此将它们设为本地文件:使用sshfs挂载远程目录。这需要本地计算机上的 FUSE 和远程计算机上的SFTP 服务器(即启动sftp-server的可执行文件)。sshd
mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34653 次 |
| 最近记录: |