我正在运行这个命令:
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
只是用来保持路径较短,以便解决方案更清晰。