我有两个目录,我们把它们称为folder1
和folder2
。每个文件夹中都有名为的图像1.jpg
,2.jpg
等等。
不幸的是,文件1.jpg
中folder1
可能不是1.jpg
中的另一张图片。此外,文件中folder2
可能与中是同一张图片。所以我无法使用文件名来区分这些图片。1.jpg
folder1
42.jpg
folder2
现在的想法是使用哈希而不是文件名。
目标是将两个文件夹合并到第三个文件夹中,以便目标文件夹包含两个文件夹的所有唯一图像。
这个问题有简单的解决办法吗?
答案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/
等。许多事情可以根据您的特定要求进行修复,但以上是一个工作基础。