在 scp 命令中使用通配符

在 scp 命令中使用通配符

我有一个 bash 脚本,它使用 scp 将多个文件复制到远程服务器。此脚本运行正常,但现在我需要添加一个名称中包含通配符的文件,但我遇到了问题。

#!/bin/sh
files=('path1/subpath/file.*.ext' 'path2/subpath2/nowildcard.ext2' 'path3/subpath3/file3.*.ext3');

for j in "${files[@]}"; do
    echo "File \033[1;38;5;226m$j\033[0m is copying."
    scp -P12345 $j "name@host:/permanent/path/$j";
done

该脚本使用通配符复制文件(例如 file.12345.ext 或 file3.4321.ext3),但在远程服务器上保存为 file.*.ext 和 file3.*.ext3。我尝试在文件名中使用反斜杠,但在这种情况下,脚本根本不复制文件。

如何解决这个问题?

提前致谢。

答案1

/bin/sh 中没有数组功能,因此使用#!/bin/bash

scp 默认显示传输文件的进度,所以我怀疑您是否真的需要自己打印出每个文件名。

您的通配符没有扩展,因为您用引号将它们添加到数组中,然后在 for 循环中引用数组扩展,因此通配符也不会扩展。

将通配符存储在数组中时让它们扩展,并将所有文件名作为 scp 参数单独发送:

#!/bin/bash
files=( 
    path1/subpath/file.*.ext 
    path2/subpath2/nowildcard.ext2 
    path3/subpath3/file3.*.ext3
)
scp -P12345 "${files[@]}" name@host:/permanent/path/

您可以通过完全省略数组来进一步简化,在这种情况下您可以回退到 /bin/sh:

#!/bin/sh
scp -P12345                         \
    path1/subpath/file.*.ext        \
    path2/subpath2/nowildcard.ext2  \
    path3/subpath3/file3.*.ext3     \
    name@host:/permanent/path/

相关内容