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는 전체 경로가 아닌 파일 이름일 뿐이므로 현재 디렉터리의 파일 이름에만 작동합니다.
  • 파일 크기를 이전 파일 크기와 비교하고 있지만 파일 목록을 크기가 아닌 이름별로 정렬하고 있습니다. 따라서 동일한 크기의 파일이 해당 목록에 반드시 연속적으로 있을 필요는 없습니다.

관련 정보