在scp命令中使用通配符


2

我有一个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)复制文件,但将文件保存在远程服务器上。* .ext和file3。*。ext3。我试图在文件名中使用反斜杠,但在这种情况下,脚本根本不会复制文件。

如何解决这个问题?

提前致谢。

Answers:


3

数组不是/ 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/

谢谢您的帮助。但是,请允许我与你不同意:)。此脚本与/ bin / sh完美配合(Mac OS 10.9)。你为我提供的解决方案。它使用通配符file.12345.ext和file3.4321.ext3复制文件,但将它们保存在根目录(/ permanent / path /)中。但我需要保留原有的路径。这就是我在脚本中使用/ permanent / path / $ j的原因。你的引言是正确的 - 这是问题的根源。刚刚在我的脚本中删除它们,它开始按预期工作。非常感谢你的帮助!
Ssey 2014年

你正在逃避#!/bin/sh因为在最新版本的OS X上,sh它实际上是bash在兼容模式下运行的。但仅仅因为你可以逃脱它,并不意味着它是一个合理的事情。
戈登戴维森2014年
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.