如何在两个目录之间找到相同大小的文件并用第二个目录中的文件覆盖第一个目录中的文件?

如何在两个目录之间找到相同大小的文件并用第二个目录中的文件覆盖第一个目录中的文件?

我有一个非常有趣的问题,我一直在努力寻找解决方案。情况如下:

我有两个目录,其中包含大量文件和文件夹(数万个)。这两个目录之间的某些文件大小相同,但文件名、文件路径和内容不同。我需要自动查找第一个目录中的大小相同的文件并将其替换为第二个目录中的文件,忽略第二个目录的目录结构和文件名。

我一直在尝试使用 fdupes 以及其他类似的工具,但它们会比较文件内容,所以这不是一个选择。

我尝试使用 gnome-search-tool 列出所有文件并按大小排序,但由于文件数量成千上万,手动替换它们很疯狂。

我一直在探索https://stackoverflow.com/questions/7541616/how-to-find-files-with-same-size,但没有一个能满足我的需要。

有人能指出我正确的解决方案吗?

答案1

在 Bash 脚本文件中尝试此操作:

#!/bin/bash

dir1="/REPLACE/THIS/WITH/FULL/PATH/TO/dir1/"
dir2="/REPLACE/THIS/WITH/Full/PATH/TO/dir2/"

echo "Indexing $dir2 ... Please wait ..."

find "$dir2" -type f -follow -exec ls -l {} \; > "dir2_ls_file.txt"

while read f1 f2 f3 f4 f5 f6 f7 f8 f9
                do
                        size="${f5}"
                        name="${f9}"
                        result0=$(find "$dir1" -type f -size "$size"c -follow)
                        result1=$(echo "$result0" | wc -l)
                        result2=$(find "$dir2" -type f -size "$size"c -follow | wc -l)
                                if [ $result2 -gt 1 ]; then
                                        echo "There is more than one file under $dir2 with the same size as $name , so no action is taken!"
                                elif [ $result1 -eq 1 ] && [ "$result0" ]; then
                                        echo "$result0 is the same size as $name , so it will be replaced."
                                #       cp "$name" "$result0"
                                else
                                        echo "There is more than one file or no file under $dir1 with the same size as $name , so no action is taken!"
                                fi
                done < "dir2_ls_file.txt"

如果您对结果满意,请取消注释cp "$name" "$result0"以进行真正的复制。

请先阅读这里了解更多信息和注意事项。

答案2

我通常会将硬盘与外部硬盘同步,其中包含大量文件和文件夹。如果您不想弄乱脚本,我建议您使用功能强大且易于使用的免费文件同步

有几种方法可以比较两个文件夹,按名称、大小、内容、日期等。

https://freefilesync.org/

下载 Linux 版本

相关内容