【问题标题】:regex/wildcard in scpscp 中的正则表达式/通配符
【发布时间】:2023-10-20 06:03:02
【问题描述】:

是否可以在scp中使用通配符

我正在努力实现:

loop
{
   substitue_host (scp path/file.jar user@host:path1/foo*/path2/jar/)
}

我不断收到“scp: ambiguous target”

实际上我正在调用一个带有 source 和 dest 的 api,它在下面使用 scp 并在 diff 主机上循环以放置文件

谢谢!

【问题讨论】:

    标签: shell unix file-transfer scp


    【解决方案1】:

    一般来说,是的,当然可以在 scp 中使用通配符。

    但是,在您的 scp 命令中,第二个参数是目标,第一个参数是源。您当然不能将一个源复制到多个目标中。

    例如,如果您尝试复制多个 jar,那么以下方法肯定会起作用:

    scp path/*.jar user@host:path2/jar/
    

    在这种情况下,“模糊目标”专门抱怨您使用的通配符会导致@host 系统上存在多个可能的目标目录。

    --- 编辑:

    如果您想复制到远程系统上的多个目录并且必须动态确定它们,则应该使用如下脚本:

     dir_list=$(ssh user@host ls -d '/path1/foo*/path2/jar/')
    
     for dir in $dir_list; do
         scp path/file.jar user@host:$dir
     done
    

    dir_list 变量将保存远程系统上ls 的执行结果。 -d 是为了让您获得目录名称,而不是它们的内容。单引号是为了确保通配符扩展等待在远程系统上执行,而不是在本地系统上。

    然后您将遍历每个目录以将远程复制到该目录中。

    (顺便说一句,这都是 ksh 语法。)

    【讨论】:

    • 谢谢。我想知道为什么无法将源复制到多个目标 [未实现]。这肯定是有人可能想做的事?我将等待更多答案,否则接受这个答案。我的问题仍未解决,但我想我的问题已得到解答:)
    • cp 及其所有派生类中,允许多个目标是不明确的——如果cp 命令中有三个文件,这是否意味着2 个源或1 个目标,或1源和 2 个目标?如果要复制到多个目标,请将其循环并逐个提供目标。
    • 我看到了模棱两可的地方 .. 并且似乎在设计上决定允许多个源和单个目标 [但是可能有一个标志来指定选项,或者可能是一个 diff 分隔符而不是空格在源列表和目标列表之间使用] ...我尝试使用通配符 (*) 所做的基本上是遍历所有匹配的目标:) .. 因为我不知道确切的目标,而是一个模式 .. 可能在那里是一些允许这样做的实用程序..
    • 见上面我的最终编辑。这应该可以让您大部分时间了解我认为您正在尝试做的事情。
    最近更新 更多