중복 파일을 찾는 명령을 찾았지만 너무 길어서 혼란스럽습니다.
예를 들어 삭제하면 -printf "%s\n"
아무 것도 나타나지 않습니다. 왜 이런 일이 발생합니까? 또한 왜 사용됩니까 xargs -I{} -n1
?
중복 파일을 찾는 더 쉬운 방법이 있습니까?
[4a-o07-d1:root/798]#find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate
0bee89b07a248e27c83fc3d5951213c1 ./test1.txt
0bee89b07a248e27c83fc3d5951213c1 ./test2.txt
답변1
다음과 같이 단축할 수 있습니다.
find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD
md5sum
발견된 파일에 대해 -exec
작업을 수행 find
하고 sort
줄바꿈으로 구분된 동일한 내용을 가진 파일을 가져오는 작업을 수행합니다 uniq
.md5sum
답변2
답변3
원래 명령을 이해하고 싶다면 단계별로 살펴보겠습니다.
find -not -empty -type f
현재 디렉터리나 해당 하위 디렉터리에서 비어 있지 않은 모든 파일을 찾습니다.
-printf "%s\n"
치수를 인쇄합니다. 이러한 매개변수를 제거하면 대신 경로가 인쇄되어 후속 단계가 중단됩니다.
| sort -rn
숫자순으로 정렬( -n
), 역순으로 정렬( -r
) 그러나 오름차순으로 정렬하고 숫자 대신 문자열로 비교하는 것도 잘 작동하므로 플래그를 제거할 수 있습니다 -rn
.
| uniq -d
중복된 연속 행을 찾아 해당 행만 유지합니다.
| xargs -I{} -n1
각 입력 줄(즉, 여러 번 나타나는 각 차원)에 대해 다음 명령을 실행하되 {}
차원으로 바꿉니다. 단일 호출에 여러 입력을 전달하는 대신 각 입력 줄에 대해 명령을 한 번 실행합니다.
find -type f -size {}c -print0
c
각 크기에 대해 실행되는 명령은 다음과 같습니다. 문자( ) 또는 보다 정확하게는 바이트로 지정된 해당 크기와 일치하는 파일을 현재 디렉터리에서 찾습니다 . 개행 문자가 포함된 파일 이름을 올바르게 처리할 수 있도록 일치하는 모든 파일 이름을 줄 바꿈 대신 널 바이트로 구분하여 인쇄합니다.
| xargs -0 md5sum
null로 구분된 각 이름에 대해 해당 파일의 MD5 체크섬을 계산합니다. 이번에는 여러 파일을 md5sum
.
| sort
uniq
연속된 행만 고려 되므로 체크섬을 기준으로 정렬합니다 .
| uniq -w32 --all-repeated=separate
처음 32바이트(체크섬, 뒤에 파일 이름)가 일치하는 행을 찾습니다. 다른 실행을 구분하는 개행을 사용하여 그러한 중복 항목의 모든 구성원을 인쇄합니다.
비교하다heemayl이 제안한 더 간단한 명령, 이것의 장점은 다른 파일과 크기가 같은 파일만 확인한다는 것입니다. 반복적인 호출을 통해 이를 보상하고 find
디렉터리 트리를 여러 번 탐색합니다. 이러한 이유로 이 명령은 파일 수가 적지만 큰 파일이 있는 디렉터리에 특히 적합합니다. 이러한 경우 체크섬 호출을 피하는 것이 반복적인 트리 순회를 피하는 것보다 더 중요할 수 있기 때문입니다.