通过将相同的文件重命名为相同的名称来删除重复项

通过将相同的文件重命名为相同的名称来删除重复项

我从事平面设计工作。我从各个网站下载了许多文件(EPS文件、PSD文件等)。

因为它来自各个网站,所以从10多个不同的网站下载后,我得到了许多相同大小的相同文件,并且一切都相同,但文件名不同(同一文件有2到4个副本)。手动一一打开去除重复非常耗时

我希望有一种方法可以将所有下载的文件重命名为不同文件的唯一名称(我不介意新名称是否不具有描述性)。

例如,2个相同的文件:nice-sun.eps从站点1下载的文件,而678.eps从站点2下载的文件。重命名后将成为相同的文件名。

答案1

此命令会将所有文件重命名为其内容的 md5sum。这意味着具有相同内容的文件将具有相同的名称。

for f in *; do mv $f $(md5sum $f | cut -d " " -f 1); done

您可以在命令中替换md5sum为。sha1sum

对于这个演示,我添加了-v一些内容mv,以便我们可以看到正在重命名的内容。

$ echo 1 > a
$ echo 2 > b
$ echo 1 > c
$ ls -1
a
b
c
$ for f in *; do mv -v $f $(md5sum $f | cut -d " " -f 1); done
`a' -> `b026324c6904b2a9cb4b88d6d61c81d1'
`b' -> `26ab0db90d72e28ad0ba1e22ee510510'
`c' -> `b026324c6904b2a9cb4b88d6d61c81d1'
$ ls -1
26ab0db90d72e28ad0ba1e22ee510510
b026324c6904b2a9cb4b88d6d61c81d1

您还可以在某些文件具有统一文件名而其他文件没有统一文件名的目录中安全地运行此命令。

$ echo 1 > d
$ echo 2 > e
$ ls -1
26ab0db90d72e28ad0ba1e22ee510510
b026324c6904b2a9cb4b88d6d61c81d1
d
e
$ for f in *; do mv -v $f $(md5sum $f | cut -d " " -f 1); done
mv: `26ab0db90d72e28ad0ba1e22ee510510' and `26ab0db90d72e28ad0ba1e22ee510510' are the same file
mv: `b026324c6904b2a9cb4b88d6d61c81d1' and `b026324c6904b2a9cb4b88d6d61c81d1' are the same file
`d' -> `b026324c6904b2a9cb4b88d6d61c81d1'
`e' -> `26ab0db90d72e28ad0ba1e22ee510510'
$ ls -1
26ab0db90d72e28ad0ba1e22ee510510
b026324c6904b2a9cb4b88d6d61c81d1

请注意,它仍然会计算已散列的文件的散列。因此,如果文件很大,您可能希望防止重新散列。

答案2

这是rename-hash我用来将文件重命名为其哈希和的脚本,保持扩展名不变。将要重命名的文件列表作为参数。用作-n试运行的第一个参数。

#!/bin/sh

unset DRY
[ "$1" == "-n" ] && { DRY=1; shift; }

for i in $@; do

if [ -f "$i" ]; then

HASHSUM=$(md5sum "$i" | sed 's/\(..........\).*/\1/')
DIR=$(dirname "$i")
BASE=$(basename "$i")
EXT=$(echo "$BASE" | sed -n 's/[^.]*\(\..*\)/\1/p')
TARGET="$DIR"/"$HASHSUM""$EXT"
if [ "$TARGET" != "$DIR/$BASE" ]; then
   if [ -n "$DRY" ]; then
       echo will rename "$i" to "$TARGET"
   else
       mv "$i" "$TARGET"
   fi
fi

fi

done

例子:

$ rename-hash -n *
will rename test.pdf to ./f604d0d6ad.pdf
will rename images.tar.gz to ./d41d8cd91b.tar.gz

答案3

有一些实用程序可以查找重复项。您可以使用 find 和 md5sum,但这可能需要相当长的时间。

我通常使用复制品为了那个原因。如果可以找到所有重复项并将其名称输出到标准输出。之后,您可以解析输出并根据需要重命名所有文件,甚至删除它们。

相关内容