414

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

最简单的方法是什么?

4

17 回答 17

535

Copy multiple files from remote to local:

$ scp your_username@remote.edu:/some/remote/directory/\{a,b,c\} ./

Copy multiple files from local to remote:

$ scp foo.txt bar.txt your_username@remotehost.edu:~
$ scp {foo,bar}.txt your_username@remotehost.edu:~
$ scp *.txt your_username@remotehost.edu:~

Copy multiple files from remote to remote:

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

Source: http://www.hypexr.org/linux_scp_help.php

于 2014-02-11T01:56:05.917 回答
263

从本地到服务器:

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

从服务器到本地:

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

于 2014-01-14T09:47:59.983 回答
87

您可以使用-rswitch 复制整个目录,因此如果您可以将文件隔离到自己的目录中,则可以一次复制所有内容。

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
于 2013-06-02T19:38:40.187 回答
64

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

于 2015-06-04T01:23:24.190 回答
37

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

真正的方法是:

scp user@remote:'/path1/file1 /path2/file2 /path3/file3' /localPath
于 2017-12-08T18:04:43.380 回答
23

在玩了 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 支持的“{}”语法相比,这个语法是通用的

于 2019-01-18T19:54:19.813 回答
15

最简单的方法是

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

于 2015-12-23T00:35:30.277 回答
14

问题:使用单个 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 or sftp copy multiple files with single command


根据评论,这在 Windows 上的 Git Bash 中也可以正常工作

于 2017-07-05T05:57:11.610 回答
11

复制多个目录:

scp -r dir1 dir2 dir3 admin@127.0.0.1:~/
于 2015-10-13T02:21:06.847 回答
7

你可以这样做:

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

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

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

于 2019-10-30T12:15:42.393 回答
4

Is more simple without using scp:

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

This also let you do some things like compress the stream (-C) or (since OpenSSH v7.3) -J to jump any times through one (or more) proxy servers.

Avoid using passwords by coping your public key to ~/.ssh/authorized_keys (on server) with ssh-copy-id (on client).

Posted also here (with more details) and here.

于 2020-10-28T07:08:19.420 回答
3
scp remote:"[A-C]/[12].txt" local:
于 2013-06-02T18:59:37.077 回答
2

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

于 2015-06-15T12:50:06.253 回答
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
于 2017-03-09T17:22:22.873 回答
2

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

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

于 2017-10-18T07:35:52.657 回答
1

scp uses ssh for data transfer with the same authentication and provides the same security as ssh.

A best practise here is to implement "SSH KEYS AND PUBLIC KEY AUTHENTICATION". With this, you can write your scripts without worring about authentication. Simple as that.

See WHAT IS SSH-KEYGEN

于 2018-02-08T10:37:13.310 回答
0
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}" .

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

-i ~/.ssh/id_rsa.pub - 假设您使用 .pub 密钥建立了到服务器的 ssh

于 2021-08-27T02:22:13.220 回答