Answers:
我发现,在较旧的HP-UX计算机(parisc 11.11)上,我不得不使用[^ a] *但是,在较新的计算机(parisc 11.31和更高版本)上,它可以与!(a *)一起使用
这就是我最终得到的。它的工作原理是:
if [[ ${S_MACH} = "phd026a" || ${S_MACH} = "tht030a" ]]
then
scp -p -r ${S_MACH}:${S_DIR}/bin/[^a^b^c^p]* ${D_DIR}/bin/.
else
scp -p -r ${S_MACH}:${S_DIR}/bin/!((a*)|(b*)|(c*)|(p*)) ${D_DIR}/bin/.
fi
传递给的远程名称scp
实际上被解释为远程端以空格分隔的模式列表。当您尝试复制名称包含空格的文件时,这通常很烦人,但在这里很有用:scp -p 'user@machine:/path/a*' .
将复制名称以开头的所有文件a
。
如果您引用该模式,则该命令将起作用,以便在传递其他障碍的情况下可以远程而非本地解释该模式。该模式!(a*)
不是基本的shell模式,而是ksh扩展名(如果设置适当的选项,bash和zsh也将支持该模式)。因此,这仅在您的远程shell是ksh时才有效,而在其他shell和您exec ksh
来自.profile
或类似的东西时则无效。
除非您处于某种受限或过时的环境中,否则简单的方法就是忘记scp
。您希望远程文件就像本地文件一样工作,因此请使其成为本地文件:使用sshfs挂载远程目录。这需要本地计算机上的FUSE和远程计算机上的SFTP服务器(即启动的sftp-server
可执行文件sshd
)。
mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .