如何在Linux上删除目录中相同大小的文件?

如何在Linux上删除目录中相同大小的文件?

我需要在 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只是文件名,而不是其完整路径,因此仅适用于当前目录中的文件名。
  • 您正在将文件的大小与前一个文件的大小进行比较,但您按名称而不是按大小对文件列表进行排序。因此,大小相同的文件不一定在该列表中连续。

相关内容