例如,在我的远程位置,有许多名为“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 ./
错误是“没有这样的文件或目录”。感谢您提前提出任何建议。
答案 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可以添加到管道。