![Wie entferne ich gleich große Dateien in einem Verzeichnis unter Linux?](https://rvso.com/image/164714/Wie%20entferne%20ich%20gleich%20gro%C3%9Fe%20Dateien%20in%20einem%20Verzeichnis%20unter%20Linux%3F.png)
Ich muss unter Linux Dateien mit identischer Größe, aber unterschiedlichem Inhalt löschen. Deshalb ist fdupes keine Option.
Ich habe den folgenden Befehl ausprobiert, allerdings wurden dadurch nicht alle Dateien mit identischer Größe entfernt (keine Ahnung, warum)
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
Irgendwelche Ideen? Was habe ich falsch gemacht?
EDIT: Ich habe im ersten Beitrag einen Fehler gemacht. Ich musshalteneine Datei der angegebenen Größe, zum Beispiel:
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
Grundsätzlich möchte ich Duplikate entfernen, aber nicht nach Prüfsumme, sondern nur nach Größe.
Antwort1
Da Sie offenbar ein GNU-System verwenden, könnten Sie Folgendes tun:
(export LC_ALL=C
find . -name '*.png' -type f -printf '%20s %p\0' |
sort -z |
uniq -zuDw20 |
cut -zb22- |
xargs -r0 echo rm -f --
)
Dadurch wird für jede Datei eine mit 20 Zeichen aufgefüllte Größe gefolgt vom Dateipfad gedruckt und es uniq -zuDw20
werden alle Einträge außer dem letzten mit duplizierten ersten 20 Bytes gemeldet.
Entfernen Sie es, echo
wenn Sie zufrieden sind.
Zu den Dingen, die Sie falsch gemacht haben:
read -d '' i
sollte seinIFS= read -rd '' i
. Siehe„IFS= read -r line“ verstehen%f
ist nur der Dateiname, nicht der vollständige Pfad. Daher funktioniert dies nur für Dateinamen im aktuellen Verzeichnis.- Sie vergleichen die Größe einer Datei mit der Größe der vorherigen Datei, sortieren die Dateiliste jedoch nach Namen und nicht nach Größe. Dateien mit derselben Größe stehen in dieser Liste also nicht unbedingt in der Reihenfolge hintereinander.