我已 sha1 汇总了存储服务器上的所有图像文件,并将结果放入以下形式的文本文件中:
sha1sum 文件名
我已对文件进行了排序并删除了所有唯一的 sha1sum 条目。所以我剩下的是重复文件的列表。有些有两个条目,有些有三个,有些甚至更多。
我想做的是删除只有第一个每个重复 sha1sum 的条目,以便我可以使用结果输出来删除重复文件(并仅保留每个文件的一个实例)
我并不关心保留哪个版本,因为稍后我会将所有文件移动到某种形式的目录层次结构中
答案1
使用 Linux 或 Cygwin 上的 GNU 实用程序,您可以uniq
使用相同的哈希值分隔每个文件块。uniq
使用该选项进行调用--all-repeated
会从进程列表中删除唯一的文件。
sha1sum * |
sort | uniq -w 40 --all-repeated=prepend |
sed -e '/^$/ { N; d; }' -e 's/^[^ ]* //' |
tr '\n' '\0' | xargs -0 rm --
对于这个简单的、可移植的脚本来说,这不值得付出努力awk
:如果每一行的第一个字段与上一行的第一个字段相同,则打印每一行。同样,这会从列表中删除唯一的文件。
sha1sum * |
sort |
awk '$1==h {print} {h=$1}' |
tr '\n' '\0' | xargs -0 rm --
您可以调用,而不是手动执行此操作复制品。
fdupes -f
答案2
你也可以使用awk 'a[$1]++'
$ gsha1sum *
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 file1
e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98 file2
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 file3
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 file4
$ gsha1sum *|awk 'a[$1]++'
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 file3
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 file4
与 Gilles 发布的命令一样,它也会删除第一个字段仅在输入中出现一次的行。
a[$1]++
可以替换为a[$1]++>0
或++a[$1]>=2
。