我的 src 目录中有以下文件结构:
en/
en/a/
en/a/file1 -> ../../en/mp3/file1-longer-name-a
en/a/file2 -> ../../en/mp3/file2-longer-name-a
en/mp3/file1-longer-name-a
en/mp3/file1-longer-name-b
en/mp3/file2-longer-name-a
en/mp3/file3-longer-name-a
我有兴趣将 en/a/ 下的所有文件复制到目标位置,保留符号链接,并且还包括引用文件(顺便说一下,它们都在 en/ 中),但如果我正在传输的任何符号链接没有引用 en/mp3/ 下的其他文件,则不包括它们。
我正在使用以下命令,它完成了这项工作的明显部分:
rsync -avRz "${SRC}./en/a" "${DST}"
这将传输以下文件:
en/
en/a/
en/a/file1 -> ../../en/mp3/file1-longer-name-a
en/a/file2 -> ../../en/mp3/file2-longer-name-a
我希望您能帮助我调整 rsync 参数,以便也可以传输以下文件:
en/mp3/file1-longer-name-a
en/mp3/file2-longer-name-a
有没有办法实现这一点,而不需要编写算法来循环遍历 en/a/ 下的软链接并逐个传输它们指向的文件?
答案1
您可以find
与 rsync 的参数结合使用--files-from
:
find "${SRC}./en/a" -type l -exec readlink {} ';'|sort|uniq|rsync -avRz --files-from=- "${SRC}" "${DST}"
find
列出 en/ 文件夹中的所有符号链接并对每个符号链接执行 readlink。- 然后我们对列表进行排序并过滤掉重复项(使用
sort
和uniq
) - 并且 rsync 将
--files-from
参数设置为-
从 stdin 读取应同步的文件