동일한 내용의 디렉토리에서 모든 폴더 찾기


10

우분투에서 디렉토리에서 중복 폴더를 찾을 수 있습니까 (즉, 동일한 내용의 폴더)? 중복 파일 (예 : fdupes)을 찾는 데 사용할 수있는 명령 줄 도구가 이미 있다고 생각하지만 대신 중복 폴더를 찾고 싶습니다. 즉, 파일 이름과 기타 메타 데이터가 다를 수 있지만 포함 된 파일의 내용과 일치하는 폴더를 찾으십시오.


디렉토리의 모든 폴더 목록을 생성하여 시작하여 (길이별로 정렬) 동일한 길이의 각 폴더 쌍을 확인하십시오.
Anderson Green

"중복"을 정의하십시오. 내부 파일이 단순히 파일 내용과 일치해야합니까? 파일 이름? 아이 노드 번호? 파일 크기?
Chris Down

@ChrisDown 질문이 업데이트되었습니다.
Anderson Green

3
예. 디렉토리는 단지 파일 일 뿐이므로, 귀하의 진술은 모호합니다. 실제로 "동일한 내용"을 갖는 것은 디렉토리 모두 동일한 inode 참조를 포함한다는 것을 의미합니다. 내부 파일의 내용이 동일해야하는지 여부와 그렇지 않은 경우 다른 규정 (mtime, filename 등)이 있는지 여부는 확실하지 않습니다 .
Chris Down

3
@ChrisDown 내 파일의 내용이 동일해야 함을 의미합니다.
Anderson Green

답변:


5
#!/bin/bash
shopt -s dotglob

for file in "$1"/*; do [[ -f "$file" ]] && d1+=( "$(md5sum < "$file")" ); done
for file in "$2"/*; do [[ -f "$file" ]] && d2+=( "$(md5sum < "$file")" ); done 

[[ "$(sort <<< "${d1[*]}")" == "$(sort <<< "${d2[*]}")" ]] && echo "Same" || echo "Different"

여기에서 실제로 볼 수 있습니다.

$ mkdir 1 2
$ ./comparedirs 1 2
Same
$ cat > 1/1 <<< foo
$ cat > 2/1 <<< foo
$ ./comparedirs 1 2
Same
$ cat > 2/1 <<< bar
$ ./comparedirs 1 2
Different

이 스크립트는 테스트되지 않았으므로 작동 방식대로 작동하는지 궁금합니다.
Anderson Green

1
@AndersonGreen 업데이트 된 답변을 확인하고 테스트했습니다.
Chris Down

좋은! 또한 여러 파일과 다른 메타 데이터 (== "동일")를 테스트 cat > 1/2 <<< bar하고 cat > 2/3 <<< bar보여야합니다.
nealmcb

@ChrisDown : 마지막 단계에서 정렬해야합니까?
harish.venkat 5

우아한 스크립트, 사소한 버그는 디렉토리 중 하나 또는 둘 다가 존재하지 않을 때 Same을 반환한다는 것입니다. 나보다 스크립팅이 더 나은 경우 쉽게 고칠 수 있어야합니다.
코사인
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.