合并 Linux 中的两个目录以获取所有唯一文件

合并 Linux 中的两个目录以获取所有唯一文件

我有两个目录,我们把它们称为folder1folder2。每个文件夹中都有名为的图像1.jpg2.jpg等等。

不幸的是,文件1.jpgfolder1可能不是1.jpg中的另一张图片。此外,文件中folder2可能与中是同一张图片。所以我无法使用文件名来区分这些图片。1.jpgfolder142.jpgfolder2

现在的想法是使用哈希而不是文件名。

目标是将两个文件夹合并到第三个文件夹中,以便目标文件夹包含两个文件夹的所有唯一图像。

这个问题有简单的解决办法吗?

答案1

如果您不关心名称,请将每个文件夹中的文件移动到目标文件夹,并根据其 MD5 哈希值重命名它们:

for f in folder1/* folder2/*;do mv -nv "$f" target/$(md5sum -b "$f" | cut -d ' ' -f 1); done

-n并非绝对必要,它可以防止第一个被移动的文件被第二个相同的文件破坏。因此最终结果是,重复文件会留在其源目录中,并且您可以知道有多少重复文件。

然后,如果有必要,给它们另一组任意名称(在 中执行target):

ls | cat -n | while read n f; do mv "$f" "$n.extension"; done

(上面的一句话来自这里

答案2

我会运行重复文件查找器(有很多,选择您最喜欢的),跨两个文件夹查找,以将它们缩减为一组唯一内容。然后在第一个文件夹中批量重命名为*folder1_*在第二个文件夹中重命名为类似名称,以确保名称唯一。然后使用普通文件移动将两者合并。

答案3

这应该可以做到,根据您的命名约定进行一些调整,并且您会丢失原始名称(否则您需要找出如果有两次相同的名称但内容不同该怎么办)。

(for file in folder1/* folder2/* ; do md5sum $file ; done) | sort | awk '{print $2 " " $1}' | uniq -f 1 -c | while read count name hash ; do cp $name dest/$hash ; done

或者,如果您不想丢失原始文件名,只需更改它:

(for file in folder1/* folder2/* ; do md5sum $file ; done) | sort | awk '{print $2 " " $1}' | uniq -f 1 -c | while read count name hash ; do cp $name dest/$(echo $name | sed -e 's/\//_/') ; done

为了简单起见,做了很多假设:没有带空格的路径,在两个目录之上执行操作,在目录中进行输出dest/等。许多事情可以根据您的特定要求进行修复,但以上是一个工作基础。

相关内容