例如,在我的偏远地区,有很多名为"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 ./
错误是"没有这样的文件或目录"。提前感谢您的任何建议。
你的 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
文件,正如另一个答案中所建议的那样......
您必须提供 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" ./
例如,使用另一台计算机上的一些空触摸转储文件输出
> ./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
...
"/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添加到管道中。