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

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

Ответ 1

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

$ scp [email protected]:/some/remote/directory/\{a,b,c\} ./

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

$ scp foo.txt bar.txt [email protected]:~
$ scp {foo,bar}.txt [email protected]:~
$ scp *.txt [email protected]:~

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

$ scp [email protected]:/some/remote/directory/foobar.txt \
[email protected]:/some/remote/directory/

Источник: http://www.hypexr.org/linux_scp_help.php

Ответ 2

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

scp file1.txt file2.sh [email protected]:~/pathtoupload

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

scp -T [email protected]:"file1.txt file2.txt" "~/yourpathtocopy"

Ответ 3

Вы можете скопировать целые каталоги с помощью -r, поэтому, если вы можете изолировать свои файлы в свой собственный каталог, вы можете скопировать все сразу.

scp -r ./dir-with-files [email protected]:upload-path

scp -r [email protected]:path-to-dir-with-files download-path

так, например,

scp -r [email protected]92.168.1.100:/var/log ~/backup-logs

Или, если их немного, вы можете использовать:

scp 1.txt 2.txt 3.log [email protected]:upload-path

Ответ 4

Как упоминал Джири, вы можете использовать scp -r [email protected]:/some/remote/path /some/local/path для рекурсивного копирования файлов. Это предполагает, что существует один каталог, содержащий все файлы, которые вы хотите перенести (и ничего больше).

Однако SFTP предоставляет альтернативу, если вы хотите передавать файлы из нескольких разных каталогов, а адресаты не идентичны:

sftp [email protected] << 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 используется "here doc" . В качестве альтернативы вы можете поместить команды SFTP в текстовый файл и выполнить sftp [email protected] -b batchFile.txt

Ответ 5

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

Реальный путь:

scp [email protected]:'/path1/file1 /path2/file2 /path3/file3' /localPath

Ответ 6

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

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

Ответ 7

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

scp -r dir1 dir2 dir3 [email protected]:~/

Ответ 8

Проблема: Копирование нескольких каталогов с удаленного сервера на локальный компьютер с помощью одной команды 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 [email protected]:/work/datasets/images/test/\{t1,t2,t3\}  .

PS: мотивировано этим великолепным ответом: scp или sftp копируют несколько файлов одной командой


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

Ответ 9

Поработав некоторое время с 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"

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

Ответ 10

ПРИМЕЧАНИЕ. Я заранее извиняюсь за ответ только за часть вышеуказанного вопроса. Тем не менее, я нашел эти команды полезными для моих текущих потребностей unix.

Загрузка определенных файлов с локального компьютера на удаленный компьютер:

~/Desktop/dump_files$ scp file1.txt file2.txt lab1.cpp etc.ext [email protected]:Folder1/DestinationFolderForFiles/

Загрузка всего каталога с локальной машины на удаленную машину:

~$ scp -r Desktop/dump_files [email protected]:Folder1/DestinationFolderForFiles/

Загрузка всего каталога с удаленного компьютера на локальный компьютер:

~/Desktop$ scp -r [email protected]:Public/web/ Desktop/

Ответ 11

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

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

Ответ 12

В моем случае я ограничен только использованием команды sftp.
Итак, мне пришлось использовать пакетный файл с sftp. Я создал script, например следующее. Предполагается, что вы работаете в каталоге /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 [email protected]

Ответ 13

В конкретном случае, когда все файлы имеют одинаковое расширение, но с разным суффиксом (скажем, номером файла журнала), вы используете следующее:

scp [email protected]:/some/log/folder/some_log_file.* ./

Это скопирует все файлы с именем some_log_file из заданной папки на удаленном компьютере, то есть - some_log_file.1, some_log_file.2, some_log_file.3....

Ответ 14

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

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

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

Ответ 15

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

Ответ 16

на удаленном сервере

tar -czf ~/files.tar.gz A/1.txt A/2.txt B/1.txt C/1.txt
exit

На локальной машине

scp remote:files.tar.gz .
tar -xzf files.tar.gz
rm files.tar.gz