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

관련 정보