给定名为的文件夹Drive1/Folder1
,/Drive2/Folder2
我想要一个文件夹/Drive3/folder3
,其中包含两个源文件夹的同步合并内容,但不包含任何已从源文件夹中删除的文件或目录。
/Drive1/Dolder1/File1
File2
/Drive2/Folder2/File6
File7
File8
/Drive3/Folder1/File1
File2
File6
File7
当File7
删除时,下一次同步会将其从目标Drive3
目录中删除,同时保留所有其他文件。
我能想到的唯一可行的解决方案是创建一个/tmp/folder3
文件夹,然后在该文件夹中建立硬链接,并使用 rsync 该文件夹--delete
,但这不起作用,因为/Drive1
它们/Drive2
不是同一卷。
我以为我可以使用 rsync 来做到这一点。但我每次尝试都会删除所有Drive1
文件或删除部分Drive2
文件。
答案1
以下内容适用于名称中不包含换行符的文件
例子
mkdir -p {Drive1/Folder1,Drive2/Folder2,Drive3/Folder}
touch Drive1/Folder1/File{1,2} Drive2/Folder2/File{6,7,8}
# Copy files from Drive1
rsync -av Drive1/Folder1/ Drive3/Folder/
# Copy files from Drive2
rsync -av Drive2/Folder2/ Drive3/Folder/
# Generate file lists
( cd Drive1/Folder1 && find -type f ) >d1f1
( cd Drive2/Folder2 && find -type f ) >d2f2
( cd Drive3/FolderM && find -type f ) | LC_ALL=C sort >d3f
# Compare them to get the list of files to delete from the destination (optional)
# Delete the list of files
comm -13 <(LC_ALL=C sort d1f1 d2f2) d3f |
while IFS= read -r file
do
echo "Deleting $file" >&2
rm -f "Drive3/Folder/$file"
done
# Tidy up
rm -f d1f1 d2f2 d3f