如何scp前100个文件夹(按字母顺序)

时间:2014-08-11 10:48:32

标签: bash ssh scp

我正在尝试将前100个目录从远程服务器复制到我的计算机上。我目前正在尝试这样做的方式是:

dir="/path/to/files/"
server="user@server.com"
scp -r $server:"$(ssh $server "ls -d ${dir}/* | head -n 100")" .

令人沮丧的是,这适用于第一个目录,然后只是为下一个99发出错误消息,其中读取(例如):

  

bash:第1行:/ path / to / files / 2nd_directory:是一个目录

有没有人想过为什么会这样,以及如何避免它?

提前致谢!

4 个答案:

答案 0 :(得分:1)

您的表达式扩展为

scp -r server:first second third .

所以你最终将server:first和本地文件secondthird复制到当前目录。

您可能需要类似

的内容
scp -r $(ssh $server "ls -d $dir/*" | sed -n -e "s%^%$server:/%p" -e 100q) .

这仍然存在parsing ls output的明显问题,但是为了快速修复,如果所有目录名都是常规的,它应该可以工作。

答案 1 :(得分:1)

您可以使用此scp+ssh命令:

scp -r "$server":"$(ssh "$server" 'cd /path/to/files; a=(*/); \
for ((i=0; i<100 && i<${#arr[@]}; i++)); do printf "/path/to/files/%s " "${a[$i]}"; done')" .

这对我有用而无需输入密码100次,因为它会在一个scp连接中复制所有文件。

答案 2 :(得分:1)

readarray -t dirs < <(exec ssh "$server" "bash -c \"printf '$server:%s\n' '$dir'/*\"")
scp -r "${dirs[@]:0:100}"

答案 3 :(得分:0)

考虑使用sftp而不是scp:

ssh $server "ls -d ${dir}/* | head -n 100" | sed 's/^/get /' | sftp $server: