例如,我想一次运行这4条命令。最简单的方法是什么?
#1 楼
将多个文件从远程复制到本地:$ scp your_username@remote.edu:/some/remote/directory/\{a,b,c\} ./
将多个文件从本地复制到远程:从远程复制多个文件:
$ scp foo.txt bar.txt your_username@remotehost.edu:~
$ scp {foo,bar}.txt your_username@remotehost.edu:~
$ scp *.txt your_username@remotehost.edu:~
来源:http://www.hypexr.org/linux_scp_help.php
评论
第一个命令省略了结尾的“。”,并且'{a,b,c}'等于\ {a,b,c \}。
–杜莱士
2014年5月5日6:04
我认为OP试图将多个本地文件夹中的多个文件复制到多个远程文件夹中,这些示例将无法完成工作,因为它们全部会将文件压缩到〜或./。
– aesede
15年4月28日在17:09
当心:大括号内逗号后没有空格。我只花了10分钟的时间来弄清楚为什么我的命令不起作用,原因是因为空格。
– Deepak
15年9月28日在15:42
从远程复制到本地时,@ duleshi {a,b,c}不完全等于\ {a,b,c \},因为第一个文件要求输入密码,而第二个文件仅要求输入密码。
– Marcelo Ventura
15年11月11日,0:24
@ MarceloVentura,@ duleshi:另外,我想补充一点,使用\ {a,b,c \}将在单个连接/批处理中传输文件(因为它们将在远程主机上扩展) {a,b,c}将打开多个连接,并且在传输许多文件时的开销非常明显
–全能性
16-4-9在10:39
#2 楼
从本地到服务器:scp file1.txt file2.sh username@ip.of.server.copyto:~/pathtoupload
从服务器到本地:
scp -T username@ip.of.server.copyfrom:"file1.txt file2.txt" "~/yourpathtocopy"
评论
这应该是最重要的答案,因为服务器不需要输入每个文件的密码:)
– motagirl2
19年1月30日在12:57
在Ubuntu 18(zsh)的客户端上不起作用。不知道在哪里应该工作。 ```(venv)➜git:(master)✗scp root @ 172.29..xxx.yyy:“ / usr / local / bin / kubectl /root/.kube/config” / tmp / root @ 172.29..xxx。 yyy的密码:协议错误:文件名与请求```不匹配
– jseguillon
19-4-26在12:24
@ motagirl2最好的答案是不要求输入每个文件的密码,只要您用反斜杠转义大括号即可。这个答案给我一个错误,找不到文件。
–冥王星
19年7月2日在22:00
@jseguillon添加-T选项以抑制该错误。
–恢复莫妮卡
19年8月30日在19:41
第二个可以在我的机器上运行,但仅不带-T选项
–Richard DiSalvo
19-09-29在20:28
#3 楼
您可以使用-r
开关复制整个目录,因此,如果可以将文件隔离到自己的目录中,则可以一次复制所有内容。scp -r ./dir-with-files user@remote-server:upload-path
scp -r user@remote-server:path-to-dir-with-files download-path
例如
scp -r root@192.168.1.100:/var/log ~/backup-logs
或者如果它们很少,则可以使用:
scp 1.txt 2.txt 3.log user@remote-server:upload-path
评论
如果我的目的地是根目录,并且正在执行etc目录,例如:scp -r / backups / etc root @ linuxbox:/,这是否有效?我的源代码是一个非常稀疏的目录,其中包含“ hosts”和nginx / sites -可用等?
– Tomachi
18年4月20日在13:21
#4 楼
如Jiri所述,您可以使用scp -r user@host:/some/remote/path /some/local/path
递归复制文件。假设存在一个目录,其中包含要传输的所有文件(没有其他内容)。但是,如果您要从多个不同的目录传输文件,则SFTP提供了另一种选择不一致:
sftp user@host << EOF
get /some/remote/path1/file1 /some/local/path1/file1
get /some/remote/path2/file2 /some/local/path2/file2
get /some/remote/path3/file3 /some/local/path3/file3
EOF
它使用“ here doc”语法定义一系列SFTP输入命令。或者,您可以将SFTP命令放入文本文件并执行
sftp user@host -b batchFile.txt
评论
这是实际回答问题的唯一答案。谢谢。我一直在谷歌搜索和分析scp手册已有很长时间了,以试图找到此功能,我想scp没有它。
– sudo
17年9月15日在22:14
这似乎是最好,最灵活的答案。注意:我被绊倒了,直到意识到需要使用/ home / vagrant / Code /之类的完整路径,而不是〜/ Code /。
–瑞安
18年8月15日在21:57
这是最好的答案,只是不要忘记添加-r表示目录
– Chris_Rands
18年8月27日在12:44
#5 楼
{file1,file2,file3}
的答案仅适用于bash(远程或本地)真正的方法是:
scp user@remote:'/path1/file1 /path2/file2 /path3/file3' /localPath
评论
太棒了!有时我会使用非bash外壳,这将带来不可估量的帮助。不仅是真实的方法,而且是正确的方法。
– Paul B.
18年6月14日在14:32
用{…,…,…}进行通配不仅在Bash中而且在许多shell中都有效。但是,这适用于任何外壳,因此显然更好。
–彼得·多布罗格斯特(Piotr Dobrogost)
18-10-8在15:08
需要更多报价。这些路径可以包含空格。
–阿米特·奈杜(Amit Naidu)
19年7月25日在1:56
好了!我会投票很多次,但是我只能做一次!谢谢Vouze!
–AndréPacheco
19年7月25日在18:38
#6 楼
与scp玩了一段时间后,我找到了最可靠的解决方案:(请注意单引号和双引号)
本地到远程:
scp -r "FILE1" "FILE2" HOST:'"DIR"'
如果文件都在同一目录中,我们可以使用*来匹配它们,例如as
scp -r HOST:'"FILE1" "FILE2"' "DIR"
与仅受某些shell支持的“ {}”语法相比,这是通用的
评论
感谢您为文件名中的空格提供帮助。我使用的是{}方法,因此引用后还必须用\对其进行转义。
–本体
19-2-22在23:16
如果要在路径中的主目录中使用波浪号(〜)。请注意〜和/必须位于引号之外。 scp -r robwaa@192.168.1.101:'〜/“ bin / set-vpn-kill-switch”〜/“ bin / flush-iptables”'〜/“”```
–罗布·瓦(Rob Waa)
19年4月11日在16:09
{}语法使从同一目录中复制多个文件变得更加容易,是否可以通过scp -r做到这一点,以便“ FILE1”和“ FILE2”可以是相对路径,而不是文件的绝对路径?
– dtasev
20年1月6日,11:07
#7 楼
最简单的方法是local$ scp remote:{A/1,A/2,B/3,C/4}.txt ./
所以{..}列表可以包含目录(A,B和C是目录;“ 1.txt”和“ 2.txt” “是那些目录中的文件名)。
尽管它会将所有这四个文件复制到一个本地目录中-不确定那不是您想要的。
您将最终将远程文件A / 1.txt,A / 2.txt,B / 3.txt和C / 4.txt复制到单个本地目录中,文件名分别为./1.txt、./2。 txt,。/ 3.txt和./4.txt
评论
这会不会在本地计算机上用B / 1.txt的内容覆盖A / 1.txt的内容?
–伊夫·多夫斯曼(Yves Dorfsman)
16年6月7日在4:03
好点..调整示例(因此现在不会覆盖)并添加了描述。谢谢。
–塔加尔
16年6月7日在15:46
像这样的Brace扩展是Bash功能,不能移植到例如POSIX sh。
–tripleee
16年7月31日在9:41
@tripleee,谢谢。它可能不是posix,但不仅适用于bash。我一直在使用ksh,它也在那里工作。
–塔加尔
16年7月31日在18:36
您还可以通过执行以下操作来混合目录和文件:local $ scp -r remote:{A / 1.txt,A / 2.txt,B / 3.txt,C / 4.txt,D,F} ./
–捐赠人
16-10-19在6:40
#8 楼
问题:使用单个SCP命令将多个目录从远程服务器复制到本地计算机,并保留每个目录在远程服务器中的位置。解决方案:SCP可以轻松做到这一点。这解决了使用多个文件夹的SCP时多次输入密码的烦人问题。因此,这也节省了很多时间!使用单个命令
基于注释,这在Windows上的Git Bash中也可以正常工作
评论
附言不要在项目之间添加空格。即\ {t1,t2,t3 \} ------>我在这里浪费了十分钟...大声笑
– Kenberkeley
18/12/20在4:58
这是最佳答案,因为当您转义括号时,它将被解释为单个命令,并且每次输入时都不会要求输入密码
– Amaynut
19年7月19日在21:35
@Amaynut是的,完全是!那当然可以节省很多时间和精力:)
– kmario23
19-10-23在13:57
#9 楼
复制多个目录:scp -r dir1 dir2 dir3 admin@127.0.0.1:~/
评论
问题是如何从远程目录复制到本地目录,而不是其他方式。
–塔加尔
16-4-19的1:50
#10 楼
您可以这样操作:scp hostname@serverNameOrServerIp:/path/to/files/\{file1,file2,file3\}.fileExtension ./
这会将列出的所有文件名下载到您所在的任何本地目录中。要在每个文件名之间放置空格,只能使用逗号
,
。 评论
当扩展名相同时,这很好。如果文件具有不同的扩展名,则可以将其写为/ path / to / files / \\ {file1.ext,file2.ext,file3.ext \\}。注意PowerShell的人(现在MS已加入聚会),您需要使用`来代替:/ path / to / files /`{file1.ext,file2.ext,file3.ext`}
– dtasev
20年1月6日11:00
#11 楼
注意:我只为回答上述问题的一部分而致歉。但是,我发现这些命令对于我当前的unix需求很有用。将特定文件从本地计算机上传到远程计算机:
~/Desktop/dump_files$ scp file1.txt file2.txt lab1.cpp etc.ext your-user-id@remotemachine.edu:Folder1/DestinationFolderForFiles/
将整个目录从本地计算机上传到远程计算机:
~$ scp -r Desktop/dump_files your-user-id@remotemachine.edu:Folder1/DestinationFolderForFiles/
将整个目录从远程计算机下载到本地计算机:
~/Desktop$ scp -r your-user-id@remote.host.edu:Public/web/ Desktop/
#12 楼
就我而言,我只能使用sftp命令。因此,我必须对sftp使用批处理文件。我创建了如下脚本。假定您正在/ tmp目录中工作,并且要将文件放在远程系统上的destdir_on_remote_system中。这也仅适用于非交互式登录。您需要设置公钥/私钥,以便无需输入密码即可登录。根据需要进行更改。
#!/bin/bash
cd /tmp
# start script with list of files to transfer
ls -1 fileset1* > batchfile1
ls -1 fileset2* >> batchfile1
sed -i -e 's/^/put /' batchfile1
echo "cd destdir_on_remote_system" > batchfile
cat batchfile1 >> batchfile
rm batchfile1
sftp -b batchfile user@host
#13 楼
scp使用ssh以相同的身份验证进行数据传输,并提供与ssh相同的安全性。此处的最佳实践是实施“ SSH密钥和公共密钥认证”。这样,您就可以编写脚本而不必担心身份验证。就这么简单。
请参阅什么是SSH-KEYGEN
#14 楼
在所有文件具有相同扩展名但后缀不同(例如日志文件编号)的特定情况下,请使用以下命令:scp user_name@ip.of.remote.machine:/some/log/folder/some_log_file.* ./
这将复制所有文件从远程给定文件夹中命名为some_log_file,即-some_log_file.1,some_log_file.2,some_log_file.3 ....
#15 楼
scp remote:"[A-C]/[12].txt" local:
评论
谢谢,但这只是一个例子,实际的文件或目录名称更为复杂。但是我有他们的清单。
–user987654
2013年6月2日19:07
您可以用正则表达式描述它们吗?
– unxnut
13年6月3日,下午1:43
是否可以通过使用正则表达式在目标目录中保留相同的目录结构?
–user987654
13年6月3日在21:36
是的,您应该可以使用-r选项来完成该操作。您可以使用-p选项保留其他属性(例如时间戳)。
– unxnut
2013年6月4日在2:49
#16 楼
不使用scp
会更简单: >也在此处和此处发布。
评论
编写脚本时,必须为每个命令输入密码。我可以避免吗?避免以这种方式重复密码:scp远程:“ A / 1.txt A / 2.txt B / 1.txt C / 1.txt”本地:./
stackoverflow.com/a/23748561/874188(被提名为与此副本的副本)具有很好的附加技术。
我建议您看一下rsync,也许它可以在这种情况下以及将来的许多情况下为您提供帮助。然后,为避免输入密码(多次输入密码),您应该阅读有关ssh公钥/私钥的信息,例如digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2
基于@JohnMudd答案的示例:scp root@192.168.56.120:'/ etc / openvpn / ca.crt /etc/openvpn/client/client0.crt /etc/openvpn/client/client0.key / etc / openvpn / client / ta.key'./。