Вопрос или проблема
Почему команда scp
не копирует ссылки с локального компьютера на другой?
scp -rp dir linux:/dir_target
Как я могу скопировать ссылки, если в исходном каталоге у меня есть как файлы, так и ссылки?
Если я правильно понимаю, что вы хотите. Вы хотите точно отразить dir на локальной машине в dir_target на linux, и она копирует содержимое символьной ссылки, а не саму символьную ссылку. Чтобы сделать точную копию, вам нужно использовать rsync вместо scp.
rsync -Wav --progress dir linux:dir_target
Я подозреваю, что это даст желаемый результат. В любом случае я обычно использую rsync, потому что он будет копировать только те файлы, которые нужно скопировать, и, как правило, более умный, чем scp.
Это хороший вопрос. К сожалению, scp не копирует символьные ссылки, и похоже, что нет планов добавить эту функцию: https://bugzilla.mindrot.org/show_bug.cgi?id=485.
Тем не менее, существуют альтернативы. Вы можете:
- Использовать
tar cvfz
, чтобы сжать папку (tar сохранит ссылки); затем scp файл tar - Использовать переключатель
rsync -e ssh
для синхронизации по ssh (например,rsync -ave ssh /src/dir user@hostname:/folder
) -
Использовать команду типа этой, чтобы найти и перечислить символьные ссылки, а затем воссоздать их на другой стороне (не отлично, но я рассматривал возможность реализации этого сам):
ls -la `find openddr_ODRINT1/ -type l`
Если вы не хотите использовать “безопасную” часть scp (“s”), вы можете использовать его предшественника “cp”.
Например, для отдельного файла выполните: cp -a ссылка, которую вы хотите сохранить или/и замените -a на -P
Если вы используете cp -r, чтобы скопировать одну папку в другое место, то символьные ссылки в исходном каталоге сохраняются в месте назначения.
например, cp -r dir-с-ссылками dest-dir –символьные ссылки остаются внутри dest-dir
На (целевых) системах, где rsync
недоступен (например, LibreElec не имеет установленного rsync) и где файловая система назначения поддерживает символьные ссылки, вы можете использовать tar без создания временного файла.
tar -C dir -cf - . | ssh linux tar -C dir_target -xf -
Это копирует файлы + символьные ссылки в dir_target
на хосте linux
.
dir_target
должен существовать.
При желании вы можете сделать следующее:
tar -cf - dir | ssh linux tar -C dir_target -xf -
Это копирует файлы + символьные ссылки из dir
в dir_target/dir
на хосте linux
. dir_target
должен существовать.
Ответ или решение
При выполнении задачи копирования файлов и символических ссылок с помощью команды scp
, пользователи часто сталкиваются с ограничениями этой утилиты. Вопрос, который вы задали, касается именно того, почему scp
не копирует символические ссылки и какие альтернативные методы могут быть использованы для решения данной проблемы.
Почему scp
не копирует символические ссылки?
Команда scp
предназначена для безопасного копирования файлов между хостами в сети и работает по протоколу SSH. Однако scp
имеет ряд ограничений, одним из которых является то, что она по умолчанию не копирует само содержимое символических ссылок (symlinks), а лишь их целевые файлы. Это может вызвать проблемы, если вы хотите создать точную копию директории, которая содержит как файлы, так и символические ссылки. При использовании scp
, команда копирует только содержимое по ссылке, а не саму ссылку.
Проблема с копированием символических ссылок с помощью scp
подробно обсуждается в это баг-отчет, который указывает на отсутствие планов по исправлению данной особенности scp
.
Альтернативные методы для копирования символических ссылок
Если ваша цель — создать точную копию директории, содержащей как файлы, так и символические ссылки, рекомендуется использовать другие инструменты, такие как rsync
или tar
.
-
Использование
rsync
:
rsync
является мощным инструментом для синхронизации файлов, который умеет работать с символическими ссылками. Для копирования директории вместе с символическими ссылками вы можете использовать следующую команду:rsync -avh --progress dir linux:/dir_target
Здесь ключ
-a
(archive) сохраняет символические ссылки, а-v
(verbose) выводит дополнительную информацию о процессе копирования. -
Использование
tar
:
Еслиrsync
недоступен, есть возможность использоватьtar
. Данная команда позволяет сохранять и восстанавливать символические ссылки без необходимости создания временного файла. Пример команды:tar -C dir -cf - . | ssh linux tar -C dir_target -xf -
Этой командой происходит копирование файлов и символических ссылок из
dir
вdir_target
на удалённом хосте. -
Копирование с помощью
cp
:
Если вам нужно скопировать символическую ссылку в локальную директорию, вы можете использовать командуcp
с ключом-P
или-a
:cp -a dir-with-links dest-dir
Ключ
-a
сохраняет все атрибуты файлов, включая символические ссылки.
Заключение
В ситуации, когда вам необходимо копировать файловую систему с сохранением символических ссылок, использование rsync
или tar
будет более эффективным и целесообразным решением по сравнению с scp
. Эти инструменты предлагают больше функциональности и гибкости, что позволяет избежать проблем с потерей данных и обеспечения целостности ваших файлов.
Это объяснение, несомненно, поможет вам выбрать правильный подход в зависимости от ваших требований и ограничений среды, в которой вы работаете.