![如何在Linux上刪除目錄中相同大小的檔案?](https://rvso.com/image/164714/%E5%A6%82%E4%BD%95%E5%9C%A8Linux%E4%B8%8A%E5%88%AA%E9%99%A4%E7%9B%AE%E9%8C%84%E4%B8%AD%E7%9B%B8%E5%90%8C%E5%A4%A7%E5%B0%8F%E7%9A%84%E6%AA%94%E6%A1%88%EF%BC%9F.png)
我需要在 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
只是檔案名,而不是其完整路徑,因此僅適用於目前目錄中的檔案名稱。- 您將文件的大小與前一個文件的大小進行比較,但您是按名稱而不是大小對文件清單進行排序。因此,具有相同大小的檔案不一定在該清單中是連續的。