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