我需要在 Linux 上删除大小相同但内容不同的文件,这就是为什么 fdupes 不是一个选项。
我尝试了以下命令,但是它没有删除所有具有相同大小的文件(不知道为什么)
last=-1; find . -type f -name '*.png' -printf '%f\0' | sort -nz | while read -d '' i; do s=$(stat -c '%s' "$i"); [[ $s = $last ]] && rm "$i"; last=$s; done
有任何想法吗?我做错了什么?
编辑:我在最初的帖子中犯了一个错误。我需要保持给定大小的一个文件,例如:
1.png # 23,5 Kb
2.png # 24,6 Kb
4.png # 24,6 Kb > remove
8.png # 24,6 Kb > remove
16.png # 23,5 Kb
基本上我想删除重复项,但不是通过校验和而仅通过大小。
答案1
由于您似乎使用的是 GNU 系统,因此您可以执行以下操作:
(export LC_ALL=C
find . -name '*.png' -type f -printf '%20s %p\0' |
sort -z |
uniq -zuDw20 |
cut -zb22- |
xargs -r0 echo rm -f --
)
这将打印 20 个字符的填充大小,后跟每个文件的文件路径,并uniq -zuDw20
报告除最后一个条目之外的所有条目,其中前 20 个字节重复。
高兴的时候去掉echo
。
你做错的事情包括:
read -d '' i
应该IFS= read -rd '' i
。看理解“IFS=读取-r行”%f
只是文件名,而不是其完整路径,因此仅适用于当前目录中的文件名。- 您正在将文件的大小与前一个文件的大小进行比较,但您按名称而不是按大小对文件列表进行排序。因此,大小相同的文件不一定在该列表中连续。