Как копировать только символические ссылки через rsync - PullRequest
8 голосов
/ 19 марта 2012

Как скопировать только символические ссылки (а не файл, на который он указывает) или другие файлы, используя rsync?

Я пытался

rsync -uvrl input_dir output_dir

, но янужно исключительно копировать только символические ссылки?

любой трюк, использующий опции include exclude?

Ответы [ 4 ]

8 голосов
/ 19 марта 2012

За на этот вопрос + ответ , вы можете написать это как канал.Каналы являются неотъемлемой частью программирования оболочки и сценариев оболочки.

find /path/to/files -type l -print | \
  rsync -av --files-from=- /path/to/files user@targethost:/path

Что здесь происходит?

Команда find начинается с / path / to /файлы и шаги рекурсивно через все "под" этой точкой.Опции find - это условия, которые ограничивают то, что выводится с помощью опции -print.В этом случае для поиска «стандартного вывода» будут напечатаны только элементы -type l (символическая ссылка в соответствии с man find).

Эти файлы становятся «стандартным вводом» команды rsync--file-from вариант.

Дайте ему шанс.Я на самом деле не проверял этого, но мне кажется, что это должно работать.

4 голосов
/ 19 марта 2012

Вы можете создать список файлов, исключая ссылки, с помощью find input_dir -not -type l, rsync имеет опцию --exclude-from=exlude_file.txt

Вы можете сделать это в два этапа:

find input_dir -not -type l > /tmp/rsync-exclude.txt

rsync -uvrl --exclude-from=/tmp/rsync-exclude.txt input_dir output_dir

одна строка bash:

rsync -urvl --exclude-from=<(find input_dir -not -type l | sed 's/^..//') input_dir output_dir

1 голос
/ 09 мая 2017

Вы можете сделать это проще, например:

find /path/to/dir/ -type l -exec rsync -avP {} ssh_server:/path/to/server/ \;

EDIT: Если вы хотите скопировать символические ссылки только из текущего каталога, не делая его рекурсивным. Вы можете сделать:

find /path/to/dir/ -maxdepth 1 -type l -exec rsync -avP {} ssh_server:/path/to/server/ \;
0 голосов
/ 28 мая 2018

Я предпочитаю это:

find ./ -type l -print > /tmp/list_of_links.txt
rsync -av --files-from=/tmp/list_of_links.txt /path/to/files user@targethost:/path

Причина проста.В предыдущей предложенной версии мне приходилось вводить свой пароль для каждого файла.Таким образом, я могу отправить все символические ссылки одновременно, введя только один пароль.

...