如何在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只是檔案名,而不是其完整路徑,因此僅適用於目前目錄中的檔案名稱。
  • 您將文件的大小與前一個文件的大小進行比較,但您是按名稱而不是大小對文件清單進行排序。因此,具有相同大小的檔案不一定在該清單中是連續的。

相關內容