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=read-r-line" 이해%f
전체 경로가 아닌 파일 이름만 사용하므로 현재 디렉터리의 파일 이름에만 작동합니다.- 파일 크기를 이전 파일 크기와 비교하고 있지만 파일 목록을 크기가 아닌 이름별로 정렬하고 있습니다. 따라서 동일한 크기의 파일이 이 목록에서 반드시 연속되는 것은 아닙니다.