Рекурсивный scp без следующих ссылок или создания гигантского файла tar?

В Debian Вы могли просто звонить x-terminal-emulator -e /some/command, поскольку это указывает на эмулятор терминала, настроенный "альтернативным" механизмом Debian. Это настроено через

# update-alternatives --config x-terminal-emulator

который позволяет, Вы выбрали который из установленных эмуляторов терминала X11 для использования в качестве по умолчанию, т.е. как x-terminal-emulator. В конце это - конструкция символьной ссылки, например, для gnome-terminal:

$ which x-terminal-emulator
/usr/bin/x-terminal-emulator
$ ls -al /usr/bin/x-terminal-emulator 
lrwxrwxrwx 1 root root 37 Apr 26  2010 /usr/bin/x-terminal-emulator -> /etc/alternatives/x-terminal-emulator
$ ls -al /etc/alternatives/x-terminal-emulator
lrwxrwxrwx 1 root root 31 Apr 26  2010 /etc/alternatives/x-terminal-emulator -> /usr/bin/gnome-terminal.wrapper
$ file /usr/bin/gnome-terminal.wrapper
/usr/bin/gnome-terminal.wrapper: Perl script, ASCII text executable

Некоторые комментарии,

4
10.12.2012, 01:29
3 ответа

Я не рекомендовал бы использовать scp для передачи больших деревьев файла непосредственно, потому что это не обрабатывает ни трудно, ни гибкие ссылки правильно, также не сжат поток.

Я рекомендовал бы cpio с (de) сжатием на лету:

ssh user@host "cd /path/to/files && find . | cpio -ov | bzip2 -c" | bunzip2 -c | cpio -ivd

Кроме того, find может обработать дополнительные условия, как "файлы должны быть меньше, чем 4G"

find . -size -4G | ...

Сделать cpio более благоприятный для пространства (для обработки пробелов в именах файлов правильно) использование

find . -print0 | cpio -0 -ivd | ...
5
27.01.2020, 20:48

Вы не должны создавать файл tar прежде, чем отправить его. Можно сделать его на лету:

cd /source/dir
tar -cf - . | ssh 'cd /destination/directory && tar -xf -'

Это действительно требует, чтобы удаленный сервер принял соединения оболочки ssh, не только scp соединения. В теории возможно отправить произвольные деревья файла удаленной стороне, которые не соответствуют ничему как локальная файловая структура, но я не знаю ни о каком существующем инструменте, чтобы сделать это.

Если символьные ссылки являются проблемой, можно сделать копию дерева каталогов, которое не включает символьные ссылки, и это израсходовало незначительное пространство, предполагая, что исходное дерево находится в файловой системе, которая поддерживает жесткие ссылки (так любая собственная файловая система Unix, или NTFS, но не FAT). Я принимаю утилиты GNU здесь:

cd /source/dir
mkdir ../regular-files-only
cp -al . ../regular-files-only
find ../regular-file-only \! -type f \! -type d -delete

Вы могли также использовать sftp. sftp -r не переходит по символьным ссылкам, в отличие от этого scp -r.

2
27.01.2020, 20:48

Другим вариантом является использование sftp -r, как указано вsftpруководстве :

.

Recursively copy entire directories when uploading and downloading. Note that sftp does not follow symbolic links encountered in the tree traversal.

Итак,

sftp -r source@surce_server.com:/source/dir.

делает именно то, что вы хотите сделать.

4
27.01.2020, 20:48

Теги

Похожие вопросы