SCP或SFTP用一个命令复制多个文件

我想复制文件从/到远程服务器在不同的目录。 例如,我想同时运行这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

最简单的方法是什么?

573301 次浏览
scp remote:"[A-C]/[12].txt" local:

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

从本地到服务器:

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

从服务器到本地:

scp -T username@ip.of.server.copyfrom:"file1.txt file2.txt" "~/yourpathtocopy"

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

$ 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

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

它使用“医生”语法来定义一系列SFTP输入命令。作为一种替代方法,您可以将SFTP命令放入一个文本文件中并执行sftp user@host -b batchFile.txt

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

复制多个目录:

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

最简单的方法是

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

在我的情况下,我被限制只能使用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

问题:使用一个SCP命令将多个目录从远程服务器复制到本地机器,并保留每个目录,因为它在远程服务器上。

解决方案: SCP可以轻松做到这一点。这解决了在对多个文件夹使用SCP时需要多次输入密码的烦人问题。因此,这也节省了很多时间!

如。

# copies folders t1, t2, t3 from `test` to your local working directory
# note that there shouldn't be any space in between the folder names;
# we also escape the braces.
# please note the dot at the end of the SCP command


~$ cd ~/working/directory
~$ scp -r username@contact.server.de:/work/datasets/images/test/\{t1,t2,t3\}  .

PS:受到这个伟大答案的激励:scp或sftp用一个命令复制多个文件 < / > < / p >


根据注释,这在Git Bash在Windows上中也可以正常工作

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

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

{file1,file2,file3}的答案仅适用于bash(在远程或本地)

真正的方法是:

scp user@remote:'/path1/file1 /path2/file2 /path3/file3' /localPath

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

这里的最佳实践是实现“SSH密钥和公钥身份验证”。这样,您就可以不用担心身份验证就可以编写脚本。就这么简单。

看到什么是ssh-keygen

在玩了一段时间scp之后,我找到了最健壮的解决方案:

(注意单引号和双引号)

本地到远端:

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

远程到本地:

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

注意,“HOST:”后面的内容将被发送到远程服务器并在那里进行解析。所以我们必须确保它们没有被本地shell处理。这就是使用单引号的原因。双引号用于处理文件名中的空格。

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

scp -r "DIR_IN"/*.txt HOST:'"DIR"'
scp -r HOST:'"DIR_IN"/*.txt' "DIR"

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

你可以这样做:

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

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

确保每个文件名之间不要有空格,只使用逗号,

不使用scp更简单:

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

这也让你可以做一些事情,比如压缩流(-C)或(自OpenSSH v7.3以来)-J,以便在任何时间跳过一个(或多个)代理服务器。

通过使用ssh-copy-id(客户端)将公钥对应到~/.ssh/authorized_keys(服务器端)来避免使用密码。

还发布了在这里(详细信息)和在这里

serverHomeDir='/home/somepath/ftp/'
backupDirAbsolutePath=${serverHomeDir}'_sqldump_'
backupDbName1='2021-08-27-03-56-somesite-latin2.sql'
backupDbName2='2021-08-27-03-56-somesite-latin1.sql'
backupDbName3='2021-08-27-03-56-somesite-utf8.sql'
backupDbName4='2021-08-27-03-56-somesite-utf8mb4.sql'


scp -i ~/.ssh/id_rsa.pub user@server.domain.com:${backupDirAbsolutePath}/"{$backupDbName1,$backupDbName2,$backupDbName3,$backupDbName4}" .

. -在最后将文件下载到当前目录

我~ / . ssh / id_rsa。Pub -假设您使用.pub密钥建立了服务器的SSH

在我的案例中,有太多名称不相关的文件。

我最后用了,

$  for i in $(ssh remote 'ls ~/dir'); do scp remote:~/dir/$i ./$i; done
1.txt                                         100%  322KB   1.2MB/s   00:00
2.txt                                         100%   33KB 460.7KB/s   00:00
3.txt                                         100%   61KB 572.1KB/s   00:00


$
scp -r root@ip-address:/root/dir/ C:\Users\your-name\Downloads\

-r将允许你下载远程服务器的dir目录中的所有文件