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

Какой самый простой способ сделать это?

20 ответов

Скопируйте несколько файлов с удаленного на локальный:

$ 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

С локального на сервер:

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

С сервера на локальный:

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

Вы можете скопировать целые каталоги с помощью -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 -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

Ответы с {file1,file2,file3} работает только с bash (удаленно или локально)

Настоящий путь это:

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

Поработав некоторое время с scp, я нашел самое надежное решение:

(Остерегайтесь одинарных и двойных кавычек)

От локального к удаленному:

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

Удаленный к местному:

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

Обратите внимание, что все, что после "HOST:" будет отправлено на удаленный компьютер и проанализировано там. Поэтому мы должны убедиться, что они не обрабатываются локальной оболочкой. Вот почему вводятся одинарные кавычки. Двойные кавычки используются для обработки пробелов в именах файлов.

Если все файлы находятся в одном каталоге, мы можем использовать *, чтобы сопоставить их все, например:

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

По сравнению с использованием синтаксиса "{}", который поддерживается только некоторыми оболочками, этот универсальный

Самый простой способ

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

Проблема: Копирование нескольких каталогов с удаленного сервера на локальный компьютер с помощью одной команды 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 копируют несколько файлов одной командой


Судя по комментариям, это также хорошо работает в Git Bash на Windows

Скопируйте несколько каталогов:

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

Сделать можно так:

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 любое время, чтобы пройти через серверы перехода.

Размещено также здесь и здесь.

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

В моем случае я ограничен использованием только команды 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

ПРИМЕЧАНИЕ: я заранее прошу прощения за ответ только на часть вышеупомянутого вопроса. Однако я обнаружил, что эти команды полезны для моих текущих потребностей 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 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 ....

Ура,

парень

В моем случае было слишком много файлов с несвязанными именами.

Я закончил тем, что использовал,

      $  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

$

Ваша команда работает отлично, но я также хочу изменить имя файла при отправке с локального на удаленный. Я написал команду:- sshpass -p пароль scp /path/to/file.txt root@hostname:/path/newfile.txt

Но выдает ошибку, что /path/newfile.txt: не найден такой файл или каталог, плз, помогите мне в этой ситуации

scp использует ssh для передачи данных с той же аутентификацией и обеспечивает ту же безопасность, что и ssh.

Наилучшей практикой здесь является внедрение "SSH KEYS И PUBLIC KEY AUTHENTICATION". Благодаря этому вы можете писать свои сценарии, не беспокоясь об аутентификации. Просто как тот.

Посмотрите, что такое SSH-KEYGEN

      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 - предполагая, что вы установили ssh на свой сервер с ключом .pub

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

в-rпозволит вам загрузить все файлы в каталоге dir вашего удаленного сервера

Другие вопросы по тегам