동일한 콘텐츠가 포함된 중복 폴더 감지

동일한 콘텐츠가 포함된 중복 폴더 감지

이름은 다르지만 내용은 동일한 폴더가 있는 경우가 많습니다.

예를 들어, 더 쉽게 액세스하기 위해 폴더를 다른 위치에 복사한 다음 해당 복사본을 삭제하는 것을 잊어버렸습니다.

동일한 내용이 포함된 중복 폴더를 어떻게 감지하나요?

중복 파일을 검색하기 위해 Czkawka를 사용했지만 중복 폴더를 검색하는 유사한 도구를 찾지 못했습니다.

유제:

중복 폴더를 감지하지만 빈 폴더의 존재는 무시합니다. https://stackoverflow.com/questions/43560796/how-to-find-duplicate-directories

중복 폴더를 감지하지만 폴더 이름이 중요합니다. 중복 디렉터리 찾기 및 나열

답변1

린트중복 디렉토리를 감지하는 기능이 있습니다.

-D --merge-directories (default: disabled)

매뉴얼 페이지에서:

만들다린트특수 모드를 사용하여 발견된 모든 중복 항목을 수집하고 전체 디렉터리 트리에서 중복 항목을 확인하세요. 주의해서 사용하십시오. rmlint 또는 해당 제거 스크립트가 실행되는 동안 조사 중인 디렉토리가 수정되지 않았는지 항상 확인해야 합니다.

중요: 같음의 정의: rmlint는 데이터가 포함된 파일의 이름이 지정되는 방식에 관계없이 정확히 동일한 데이터가 포함된 두 디렉터리를 동일한 것으로 간주합니다. rmlint가 디렉터리에 있는 데이터에서 길고 정렬된 스트림을 생성하고 이를 마법 같은 방식으로 다른 디렉터리와 비교한다고 상상해 보세요. 이는 기본적으로 디렉토리의 레이아웃이 중요하지 않음을 의미합니다. 빈 파일도 콘텐츠로 간주되지 않습니다. 일부 사용자에게는 이것이 놀랍게 느껴질 수도 있지만 rmlint는 일반적으로 콘텐츠에만 관심이 있고 다른 메타데이터나 레이아웃에는 관심이 없다는 점을 명심하세요. 동일한 계층 구조를 가진 트리만 찾으려면 --honour-dir-layout/-j를 사용해야 합니다.

답변2

이 문제를 해결하는 가장 간단한 방법은 물론처음부터 문제는 없었어요;당신은 불변의 파일 세트에 관심이 있는 것 같으므로 cp -r original second대신 ,를 사용 ln -s original second하고 Linux가 이미 모든 폴더나 파일을 파일 시스템 계층의 다른 지점으로 "미러링"할 수 있다는 사실을 활용할 수 있습니다.

데이터의 두 번째 인스턴스에서 파일을 변경하는 기능이 필요한 경우 참조 카운트 파일 시스템(XFS, btrfs 등)을 사용하고 복사본이 있다는 사실을 무시하는 것이 좋습니다. 변경 사항은 없습니다. 사용 중인 파일의 복사본에 추가 공간을 사용하지 마십시오.

이제 둘 다 옵션이 아니라고 가정합니다.

모든 디렉터리를 모든 디렉터리와 비교해야 하기 때문에(다행히도 하나의 파일 시스템에 머물고 심볼릭 링크를 따르지 않는 한 루프가 없습니다) 트리 검색에서 하위 트리를 복제해야 합니다. 나는 쉘 스크립팅이 그래프 데이터 구조를 다루려는 환경이 아니라고 생각합니다. 쉘의 복잡성과 인간 프로그래머 모두에게 그것은 빠르게 폭발합니다.

Rust, C++, Go, Erlang...을 연마하고 코딩을 시작하세요.

디렉터리 트리의 메모리 내 표현을 준비하려면 디렉터리 구조를 재현하는 깊이 우선 검색 알고리즘을 작성해야 합니다. 각 노드에는 값(예: 64비트 정수)이 있으며 처음에 처리되었는지 여부는 처리된 것으로 표시되는 노드가 없습니다.

그런 다음 해당 트리에서 리프 노드(즉, 다른 디렉터리를 포함하지 않는 디렉터리)를 가져와 그 안에 있는 파일 집합의 해시를 계산합니다(안정적이고 정렬된 방식으로 해시에는 사용자가 관심을 갖는 내용, 즉 수정 시간, 이름, 크기, 내용)? ...) 해당 해시는 해당 리프 노드의 값이 되며 해당 노드를 처리된 것으로 표시하고 이를 해시 맵에 입력합니다(노드 값을 해시로 사용). 값이 이미 해시 맵의 키인 경우 실제 ID를 확인하고(해시 함수는 이를 보장하지 않습니다!) 적절한 복사본을 제거하고 트리에서 해당 노드를 삭제합니다.

모든 리프 노드를 처리된 것으로 표시한 후(트리에서 제거한 경우에도) 첫 번째 리프 노드의 첫 번째 상위로 이동하여 디렉터리 내용을 해시합니다. 이번에는 노드를 "처리됨으로 표시"합니다. 파일을 자체 노드가 있는 일반 노드로 처리합니다. 적절한 해시 값. 이를 통해 첫 번째 상위 노드의 값을 가져옵니다. 이를 처리된 것으로 표시하고 해시 테이블에 추가하고 필요한 경우 삭제한 다음 다음 리프 노드로 이동하여 동일한 작업을 수행합니다.
해당 디렉터리 탐색을 수행하면 리프 노드와 리프 노드의 모든 형제 항목(이는 하나의 디렉터리에만 있으며 트리에서 "상위"에 동일한 복사본을 가질 수 없습니다. 다른 깊이 하위 디렉터리).

완료되면 이전 "리프의 두 번째 수준" 노드가 리프 노드가 됩니다. 루트 노드에 값이 할당될 때까지 이 작업을 반복합니다.

답변3

연습으로 쉘에 중복 디렉토리 찾기를 구현했습니다.

https://github.com/ilario/finddirdupes

첫 번째 매개변수는 분석할 폴더이고, 두 번째 매개변수는 고려해야 할 최소 디렉터리 크기(바이트)입니다. 많은 빈 폴더가 감지되지 않도록 하려면 최소 5000개 이상을 사용하는 것이 좋습니다.

./finddirdupes.sh ~/documents 10000

분명히 rmlint -D다른 댓글에 보고된 것보다 훨씬 느립니다.

답변4

이 코드는 파일 내용이 동일한지 확인하지 않으므로 직접 확인해야 합니다.

크기와 하위 폴더, 포함된 파일 이름을 기준으로 폴더를 비교합니다.

실행하기 전에 명령 -s옵션이 ls -s시스템에 적합한지 확인하십시오.

# avoid starting with a non-empty dirhash file
rm dirhash

# while reads all the folders list provided by find (the <<< is a here string, passing the find output as an input to read)
# cd enters the folder
# ls lists the content, -1 on only one column, -a including the hidden files, -s indicating the files size (check if this works on your system), -R recursively entering every subdirectory
# xxhsum calculates a string from the output of ls
# the XXH3 hashing algorithm was the one suggested on
# https://xxhash.com/#benchmarks.
# du calculates the total size of the folder
while read d; do cd "$d"; hash=$(ls -1asR | xxhsum -H3); size=$(du -s); cd "$OLDPWD"; echo $hash $size $d >> dirhash; done <<< $(find ./ -type d)

# sort sorts the file based on the dir size, and then on the hash
# uniq shows all the duplicates based on the first 38 characters, which include the hash and the size from du
sort -k5n,5 -k4,4 dirhash | uniq --all-repeated=separate -w 38

관련 정보