scp或sftp使用单个命令复制多个文件

时间:2013-06-02 18:56:08

标签: sftp scp

我想将文件从/向远程服务器复制到不同的目录中。 例如,我想一次运行这4个命令。

scp remote:A/1.txt local:A/1.txt
scp remote:A/2.txt local:A/2.txt
scp remote:B/1.txt local:B/1.txt
scp remote:C/1.txt local:C/1.txt

最简单的方法是什么?

17 个答案:

答案 0 :(得分:333)

将多个文件从远程复制到本地:

$ 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:~

将多个文件从远程复制到远程:

$ scp your_username@remote1.edu:/some/remote/directory/foobar.txt \
your_username@remote2.edu:/some/remote/directory/

来源:http://www.hypexr.org/linux_scp_help.php

答案 1 :(得分:85)

从本地到服务器:

scp file1.txt file2.sh username@ip.of.server.copyto:~/pathtoupload

从服务器到本地:

scp username@ip.of.server.copyfrom:"file1.log file2.log" "~/yourpathtocopy"

答案 2 :(得分:59)

您可以使用-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

答案 3 :(得分:41)

正如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

答案 4 :(得分:16)

scp user@remote:'/path1/file1 /path2/file2 /path3/file3' /localPath 的答案仅适用于bash(在远程或本地)

真正的方法是:

[12656:18380:1208/102259.167:ERROR:configuration_policy_handler_list.cc(92)] 
Unknown policy: DHEEnabled
[12656:18380:1208/102259.167:ERROR:configuration_policy_handler_list.cc(92)] 
Unknown policy: RC4Enabled
[12656:18380:1208/102259.168:ERROR:configuration_policy_handler_list.cc(92)] 
Unknown policy: SSLVersionMin

答案 5 :(得分:14)

最简单的方法是

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

答案 6 :(得分:12)

复制多个目录:

scp -r dir1 dir2 dir3 admin@127.0.0.1:~/

答案 7 :(得分:10)

问题:使用单个SCP命令将多个目录从远程服务器复制到本地计算机,并保留远程服务器中的每个目录。

解决方案:SCP可以轻松完成此操作。这解决了在使用具有多个文件夹的SCP时多次输入密码的烦人问题。因此,这也节省了大量时间!

e.g。

function

PS:受到这个好答案的启发:scp or sftp copy multiple files with single command

根据评论,这也适用于 Windows上的Git Bash

答案 8 :(得分:8)

使用scp一段时间后,我找到了最可靠的解决方案:

(请注意单引号和双引号)

本地到远程:

# A tibble: 6 x 5
     x0    y0    x1    y1 source  
  <dbl> <dbl> <dbl> <dbl> <chr>   
1  22.6  62.9  45.8  69.9 original
2  38.5  56.6  49.3  21.9 original
3  73.7  27.7  80.8  14   original
4  45.8  69.9  38.5  56.6 added   
5  49.3  21.9  73.7  27.7 added   
6  80.8  14    NA    NA   added  

远程本地:

df2 <- df2 %>% mutate(x1 = lead(x1), y1 = lead(y1),source = "added", ID = seq(1,n()*2, by =2)+1)

df <- df %>% mutate(source = "original", ID = seq(1,n()*2, by =2)) %>% bind_rows(., df2) %>% arrange(ID)

# A tibble: 6 x 6
     x0    y0    x1    y1 source      ID
  <dbl> <dbl> <dbl> <dbl> <chr>    <dbl>
1  22.6  62.9  45.8  69.9 original     1
2  45.8  69.9  38.5  56.6 added        2
3  38.5  56.6  49.3  21.9 original     3
4  49.3  21.9  73.7  27.7 added        4
5  73.7  27.7  80.8  14   original     5
6  80.8  14    NA    NA   added        6

请注意,“ HOST:”之后的所有内容都将发送到远程并在那里进行解析。因此,我们必须确保本地外壳程序不会处理它们。这就是为什么使用单引号引起来的原因。双引号用于处理文件名中的空格。

如果文件都在同一目录中,我们可以使用*来匹配它们,例如

scp -r "FILE1" "FILE2" HOST:'"DIR"'

与仅由某些shell支持的使用“ {}”语法相比,这是通用的

答案 9 :(得分:3)

注意:我提前道歉,只回答上述问题的一部分。但是,我发现这些命令对我当前的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/

答案 10 :(得分:2)

你的命令工作正常但是,我也希望在将本地发送到远程时更改文件名。我写了一个命令: - sshpass -p password scp /path/to/file.txt root @ hostname:/path/newfile.txt

但它给出了错误 /path/newfile.txt:找不到这样的文件或目录 PLZ在这种情况下帮助我

答案 11 :(得分:2)

就我而言,我只能使用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

答案 12 :(得分:1)

在所有文件具有相同扩展名但具有不同后缀(例如日志文件数)的特定情况下,您使用以下内容:

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 ....

干杯,

答案 13 :(得分:1)

scp使用ssh进行相同身份验证的数据传输,并提供与ssh相同的安全性。

这里的最佳实践是实施&#34; SSH密钥和公共密钥认证&#34;。有了这个,您可以编写脚本而无需担心身份验证。就这么简单。

请参阅WHAT IS SSH-KEYGEN

答案 14 :(得分:0)

scp remote:"[A-C]/[12].txt" local:

答案 15 :(得分:0)

您可以这样:

scp hostname@serverNameOrServerIp:/path/to/files/\\{file1,file2,file3\\}.fileExtension ./

这会将所有列出的文件名下载到您所在的任何本地目录中。

请确保不要在每个文件名之间放置空格,而只能使用逗号,

答案 16 :(得分:0)

更简单,无需使用scp

tar cf - file1 file_n | ssh user@server 'tar xf -'

这还使您可以执行一些操作,例如随时压缩流(-C或(自OpenSSH v7.3起)-J以通过跳转服务器。

还发布了herehere