rsync --delete 完全理解保留源目录并将文件与目标目录同步的正确语法

rsync --delete 完全理解保留源目录并将文件与目标目录同步的正确语法

我正在运行这个命令:

rsync -av --dry-run /home/acnt/public_html/_private/database/static/categories/temp/ --delete-after /home/acnt/public_html/_private/database/static/categories/

在我的许多测试中,它不会保留临时目录,它会删除所有文件和整个目录树以及类别树下的所有其他目录。

/home/acnt/public_html/_private/database/static/categories/
/home/acnt/public_html/_private/database/static/categories/temp
/home/acnt/public_html/_private/database/static/categories/dir1
/home/acnt/public_html/_private/database/static/categories/dir1/temp
/home/acnt/public_html/_private/database/static/categories/dir2
/home/acnt/public_html/_private/database/static/categories/dir2/temp

我想将这些目录保留在类别下,但未能使语法正确。

我所追求的是一种将我的临时目录内容/home/acnt/public_html/_private/database/static/categories/temp/与其中未找到的/home/acnt/public_html/_private/database/static/categories/文件同步并删除的方法。/home/acnt/public_html/_private/database/static/categories//home/acnt/public_html/_private/database/static/categories/temp/

我想知道我是否能够以这种方式使用 rsync 或者我的树结构是否是这里的问题。

答案1

问题是你的目标目录包含源目录。源目录正在被修改(删除),因为它是目标目录层次结构的一部分(并且因为它显然不包含本身)。

为了解决这个问题,我建议将(您的源目录)移至(您的目标目录).../categories/temp之外的某个位置。.../categories这样,源目录就不会因为是目标层次结构的一部分而被修改。

答案2

假设您确实想从temp目标内部的目录进行复制,您需要告诉rsync不要从目标中删除该子树。

在本例中,排除的目录树位于temp目标树的顶部,因此/temp.为了表明rsync我们要排除一个目录而不是我们后缀为 的文件/,因此最终的排除变为/temp/.

base=/home/acnt/public_html/_private/database/static/categories
rsync --dry-run -av --delete-after --exclude '/temp/' "$base/temp/" "$base/"

$base只是用来保持路径较短,以便解决方案更清晰。

相关内容