如何通过rsync仅复制符号链接

时间:2012-03-19 19:13:23

标签: linux unix rsync symlink

如何使用rsync仅复制符号链接(而不是它指向的文件)或其他文件?

我试过

rsync -uvrl input_dir output_dir

但我只需要复制符号链接吗?

使用包含排除选项的任何技巧?

4 个答案:

答案 0 :(得分:7)

this question+answer,您可以将其编写为管道脚本。管道是shell编程和shell脚本的一个组成部分。

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

这里发生了什么?

find命令从/ path / to / files开始,并以递归方式逐步执行该点下的所有内容。 find的选项是限制-print选项输出内容的条件。在这种情况下,只会打印-type l(符号链接,根据man find)的内容以查找“标准输出”。

这些文件成为rsync命令的--file-from选项的“标准输入”。

试一试。我实际上并没有测试这个,但在我看来它应该可行。

答案 1 :(得分:4)

您可以生成一个文件列表,不包括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

答案 2 :(得分:1)

您可以更轻松地执行此操作:

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

编辑: 如果要仅复制当前目录的符号链接而不使其递归。你可以这样做:

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

答案 3 :(得分:0)

我更喜欢这个:

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

原因很简单。在之前建议的版本中,我必须在每个文件中输入我的密码。这样我只需输入一个密码即可立即发送所有符号链接。