scp一系列文件

时间:2014-01-21 21:18:40

标签: bash range scp

例如,在我的远程位置,有许多名为“file_1”到“file_50500000”的转储文件,我只需要从file_1000000到file_50500000的文件,增量为100000.

#!/bin/bash
files=""
for i in `seq -f '%9.0f' 1000000 100000 50500000`; do
files="$files file_$i.dump"
done
scp user@abc.abc.com:/user/$files ./

错误是“没有这样的文件或目录”。感谢您提前提出任何建议。

3 个答案:

答案 0 :(得分:1)

您必须提供scp的完整路径,并且您可能有引用问题,请尝试

#!/bin/bash
files="/user/file_1000000.dump"
for i in `seq -f '%9.0f' 1100000 100000 50500000`; do
  files="$files /user/file_$i.dump"
done
scp "user@abc.abc.com:/$files" ./

e.g。在另一台计算机上使用一些空的触摸转储文件输出

> ./script
user password:
file_1000000.dump                             100%    0     0.0KB/s   00:00    
file_1100000.dump                             100%    0     0.0KB/s   00:00    
file_1200000.dump                             100%    0     0.0KB/s   00:00    
file_1300000.dump                             100%    0     0.0KB/s   00:00    
file_1400000.dump                             100%    0     0.0KB/s   00:00    
file_1500000.dump                             100%    0     0.0KB/s   00:00  
...

答案 1 :(得分:1)

您的for循环添加到$files,如下所示:

files="$files file_$i.dump"

# $files will look like this when the loop is done:
" file_1000000.dump file_1100000.dump file_1200000.dump ..."

现在看看当你使用scp时会发生什么:

scp user@abc.abc.com:/user/ file_1000000.dump file_1100000.dump file_1200000.dump ./

这显然不起作用。

如果您的文件确实在子文件/user中(确定您不是~user?),则可以使用{}对它们进行分组。将它们添加到循环中的$files,如下所示:

files="$files,file_$i.dump"
# When finished, it will look like this (yes leading ,)
",file_1000000.dump,file_1100000.dump,file_12000000.dump,..."

现在使用bash变量替换调用scp以删除前导,

scp user@abc.abc.com:/user/{${files#,}} ./

如果这感觉太复杂而你不介意额外的转移时间,可能只是在循环中逐个scp个文件,如另一个答案所示......

答案 2 :(得分:0)

远程文件路径中缺少“/ user”。它只在第一个文件路径中,实际上我不确定是否可以通过这种方式为scp指定文件。我更喜欢:

for i in `seq -f '%9.0f' 1000000 100000 50500000`; do
    scp user@abc.abc.com:/user/file_$i.dump .
done

如果文件很小,还有另一种方法可以避免建立连接的开销

ssh user@abc.abc.com "cd /user/; tar cf - $(seq -f '%9.0f' 1000000 100000 50500000)" |tar xf -

它创建tar存档并将其写入标准输出,该输出被重定向到本地计算机,而另一个tar将文件从stdout写入文件。压缩“z”的选项可以用于两个tar,如果它被支持或gzip和gunzip可以添加到管道。

相关问题