![Linux의 디렉토리에서 동일한 크기의 파일을 제거하는 방법은 무엇입니까?](https://rvso.com/image/164714/Linux%EC%9D%98%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%97%90%EC%84%9C%20%EB%8F%99%EC%9D%BC%ED%95%9C%20%ED%81%AC%EA%B8%B0%EC%9D%98%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.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
는 전체 경로가 아닌 파일 이름일 뿐이므로 현재 디렉터리의 파일 이름에만 작동합니다.- 파일 크기를 이전 파일 크기와 비교하고 있지만 파일 목록을 크기가 아닌 이름별로 정렬하고 있습니다. 따라서 동일한 크기의 파일이 해당 목록에 반드시 연속적으로 있을 필요는 없습니다.