我有一个 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/