如何使用正则表达式进行scp


13

我正在尝试在ksh中复制所有不以字母“ a”开头的文件。

从源计算机复制到目标计算机工作正常

scp -p !(a*) user@machine:/path/directory/.

但是,如果我在目标服务器上并想从源服务器复制,则失败:

scp -p user@machine:/path/!(a*) .

有任何想法吗?

Answers:


17

我同意vonbrand。定位由运行中的外壳处理。因此,scp user@machine:/path/*将/ path / *扩展到LOCAL / path / *中的文件,而不是远程计算机上的文件。

但是,仅出于笑容,我尝试过:

scp "user@machine:/path/[regex here]" .  

和...。试试看 注意引号。很有必要 让我们知道

注:在远程计算机上的用户帐户可能会默认为不是一个不同的外壳程序你的,所以外卡扩充的规则可能不同,因此“洁具这一点。


1

这不是“带有正则表达式的scp”,用于处理文件glob的一个是shell。scp只是交给已经扩展的文件列表。扩展发生在运行命令的计算机上。

抱歉,不能(轻松)做到。


这个答案是错误的。请删除:)
迈克尔(Michael)

1

我发现,在较旧的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

这两种解决方案都适用于11.11服务器。
DarkHeart 2015年

0

传递给的远程名称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*) .
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.