我正在尝试将前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:是一个目录
有没有人想过为什么会这样,以及如何避免它?
提前致谢!
答案 0 :(得分:1)
您的表达式扩展为
scp -r server:first second third .
所以你最终将server:first
和本地文件second
和third
复制到当前目录。
您可能需要类似
的内容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: