Может ли scp копировать каталоги рекурсивно?
В настоящее время я могу скопировать только один файл .tar
. Но как я могу скопировать каталоги рекурсивно с помощью scp
?
9 ответов
Yup, используйте -r
:
scp -rp sourcedirectory [email protected]:/path
- -r означает рекурсивный
- -p сохраняет время модификации, время доступа и режимы из исходного файла.
Примечание. Это создает sourcedirectory
внутри /path
, поэтому файлы будут находиться в /path/sourcedirectory
В то время как предыдущие ответы технически правильны, вы также должны рассмотреть возможность использования rsync
. rsync
сравнивает данные на отправляющей и принимающей сторонах с механизмом diff, поэтому ему не нужно повторно отправлять данные, которые уже были отправлены ранее.
Если вы собираетесь копировать что-то на удаленный компьютер более одного раза, используйте rsync
. На самом деле, полезно использовать rsync
каждый раз, потому что у него больше элементов управления для таких вещей, как копирование прав на файл и права собственности и исключение определенных файлов или каталогов. В общем:
$ rsync -av /local/dir/ server:/remote/dir/
синхронизирует локальный каталог с удаленным каталогом. Если вы запустите его второй раз, а содержимое локального каталога не изменилось, данные не будут переданы - гораздо эффективнее, чем запуск scp
и копирование всего каждый раз.
Кроме того, rsync
позволяет очень легко восстанавливать прерванные передачи, в отличие от scp
.
Наконец, современные версии rsync
по умолчанию запускаются через ssh, поэтому, если scp
уже работает, rsync
в значительной степени будет падать - в замене.
Это вариант -r
. :)
Подробнее см. справочную страницу scp для получения дополнительной информации.
Рекурсивный вариант копирования '-r' (нижний регистр)
scp -r
Что я путаю с регулярным локальным рекурсивным вариантом копирования «-R» (верхний регистр)
cp -R
Лучший способ - использовать rsync через SSH
rsync -a -essh /source/ [email protected]:/dest/
rsync -a -essh [email protected]:/source/ /dest/
Мои избранные варианты: -Pazvessh --delete:
- -a: режим архива (включая множество стандартных параметров по умолчанию, включая сохранение символических ссылок)
- -z: compress
- -v: verbose: показать файлы
- -P: показать progess как файлы, сделанные /оставшиеся файлы
- -e ssh: выполнить rsync в протоколе ssh
- - удалить: удалить файлы в месте назначения, которые больше не находятся в исходном тексте
После поиска флага рекурсивной копии и успешного использования этого сообщения, я хотел бы опубликовать только предложение.
Если дело в том, что вы копируете (рекурсивно) каталог. Может быть, если файлы отправлены сжатыми, вы можете сэкономить время в передаче
В конце концов я сделал следующее:
local$ tar -czvf local.tar.gz directory/
local$ scp local.tar.gz [email protected]:/directory
ssh [email protected]
remote$ tar -xzvf local.tar.gz
Надеюсь, что это поможет
Вы можете рекурсивно скопировать каталог в сжатый архив с помощью этой простой команды:
ssh -p 22 [email protected] 'cd /parent/directory && tar zcvf - directory_to_copy' > /destination/on/your/machine/archive_name.tgz
Например, чтобы скопировать содержимое /var/log
из domain.com
в ~/logs.tgz
, которое вы запускаете:
ssh -p 22 [email protected] 'cd /var && tar zcvf - log' > ~/logs.tgz
Вы также можете извлекать файлы в целевой системе, используя каналы. Эта команда скопирует содержимое /var/log
в domain.com
в ~/destination/log
в вашей системе:
ssh -p 22 [email protected] 'cd /var && tar zcvf - log' | tar xzf - -C ~/destination
Хотя для зеркалирования каталога вы, вероятно, должны использовать rsync
...
Если вы предпочитаете передавать пароль пользователя в качестве параметра, а не вводить его в интерактивном режиме, вы можете использовать sshpass
(sudo apt-get install -y sshpass
).
Пример:
sshpass -p 'remote_password' scp -rp /src/folder [email protected]:/dest/folder
Другой вариант (скорее всего, для повторного использования) - использовать NFS - проверить nfs-kernel-server и как настроить общие ресурсы NFS.