将两个文件夹同步为一个,删除已删除的文件

将两个文件夹同步为一个,删除已删除的文件

给定名为的文件夹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

相关内容