중복 된 파일은 같은 폴더에있는 경우에만 제거하십시오.


4

나는 FAQ를 읽었으며 이것이 제품 권장 사항을 묻는 질문과 같이 닫히는 것에 가깝다는 것을 알고있다.

필자는 적어도 40 개의 "중복 파일"제거 유틸리티 (Windows, OSX 및 Linux)를 살펴 보았으며 그 중 어느 것도 내가 찾고있는 특정 기능을 가지고 있지 않습니다.

나는 지금이 일을 할 수있는 것이 있거나 내 도구를 써야 할 필요가있는 것이 있으면 필요합니다.

그냥 "예, 존재합니다"대답은 나와 함께 괜찮을 것입니다.
그것은 단지 내가 충분히 열심히 검색하지 않았 음을 의미합니다.

필자가 요구하는 기능 : 대형 폴더 구조에서 중복 파일을 제거 할 수 있지만, 중복 파일이 SAME 폴더에있는 경우에만 제거하십시오.
예 : 동일한 파일 A, B 및 C가 있다고 가정 해보십시오. A와 C는 같은 폴더에 있습니다. B가 다른 폴더에 있습니다. A 또는 C 중 하나를 제거 (선호하지 않음)해야하지만 B는 그대로 두어야합니다.

이 일을 할 수있는 뭔가가 있습니까?
(Windows가 좋지만 OS-X 또는 Linux도 좋습니다.)


먼저 : -type d를 찾아 모든 폴더를 탐색합니다. -exec를 사용하여 -maxdepth 1과 -exec를 사용하여 새 파일을 찾으면 해당 디렉토리의 모든 파일에 적용됩니다. 그래도 매우 비효율적 인 것 같습니다. 일회용 솔루션이 필요하거나 자주 실행해야합니까? 편집하다 md5hash를 사용하여 하나의 파일을 모두 저장 한 다음 해당 파일에서 작업하는 것이 더 효율적입니다.).
Hennes

이 질문은 허용되는 질문의 범위 내에있는 것으로 보입니다. 소프트웨어가이를 수행하도록 요청하지 않는 한, 어떤 방식 으로든.
Jon

이 도구를 자동화하고 일괄 처리 작업을 수행 할 수 있다고 가정합니까?
Ramhound

나는 파이썬이 당신이 필요로하는 것을 가지고 있다고 말하고있다 (주로 비슷한 도구로 작업하고 있기 때문에). os, filecmp 및 shutil 모듈을 사용하면 "상대적으로"쉽게 할 수 있습니다. 가장 좋은 부분 인 Python은 이러한 시스템에서 이식 가능합니다.
Doktoro Reichard

@Hennes, Ramhound 저는 8000 만개 이상의 파일이있는 15000 개의 폴더에서 매 2 주마다 실행해야하며 약 0.1 %의 중복이 예상됩니다. MD5 해쉬 충돌 (가능하지는 않지만)은 받아 들일 수 없으며 완전한 이진 비교가 필요합니다. 다행히도 대부분의 파일 자체는 상대적으로 작습니다 (80 % <1MB, 19 % <5MB, 1 % 약 100MB).
Tonny

답변:


3

당신이 사용할 수있는 fdupes 없이 -r 그래서 하위 디렉토리로 내려 가지 않습니다. 이렇게하면 중복 파일 목록이 인쇄됩니다.

find . -type d -exec fdupes -n {} \;

-n 빈 파일을 무시합니다. 더하다 -dN ( --delete --noprompt )를 사용하여 첫 번째 중복 파일을 제외한 모든 파일을 삭제합니다.

설치할 수 있습니다. fdupes OS X에서 brew install fdupes.


내가 이해한다면, OP는 모든 하위 디렉토리에서 명령을 실행해야 할 것입니까?
Doktoro Reichard

아니요, 명령은 현재 디렉토리 아래의 모든 디렉토리를 재귀 적으로 찾은 다음 실행합니다. fdupes 그들 안에.
Lri

약간 더 긴 설명. find 현재 디렉토리에서 검색을 시작합니다 ( . ) 모든 파일과 디렉토리를 찾습니다. 그만큼 -type d 옵션은 모든 디렉토리에이를 제한합니다. 따라서 모든 디렉토리 목록이 없습니다. 그것들 각각에 대해 exec 프로그램 fdupes -n 디렉토리 이름이 추가됩니다 (즉, {} ).
Hennes

먼저 Homebrew를 설치해야했지만, 이제는 -ndN을 사용하여 거리를 헤매고 있습니다. 지금 1 시간 동안 달리기. 총 약 5 시간이 걸릴 것으로 보이는데 그리 나쁘지 않습니다. (MacApp에서 NetApp NAS의 SMB 공유에 대해 실행중인 경우 NAS에 10G LAN이 있고 Mac에만 1G가 있으므로 NAS를 포화 상태가 아닙니다. (Linux 서버를 사용할 수 있었지만 10G에서도 가능함) ... 다른 사용자가 너무 행복하지 않을 것이라고 생각합니다.)
Tonny

5

글쎄, 내가했던 것처럼 파이썬 스크립트를 작성했다.

나는 그것을에 접대했다 Google 코드 GPL v3으로 공개 소스를 만들었으므로 프로그램을 개선하고 싶은 사람은 누구나 할 수 있다고 가정합니다.

또한 다소 디버깅했습니다 (Windows에서 수십 개의 파일을 만들고 원본을 모두 삭제했습니다). 이 코드는 코드가 실제로하는 일을 누구에게 알리는 것과 같이 매우 높게 평가됩니다.

파이썬 3.3에서 실행했지만 파이썬 2에서 작동해야한다고 가정합니다.

아, 그리고 가장 중요한 부분은, 그것은 모든 OS Python (Windows, OSX, Linux, ...)에서 지원되어야합니다.


개인적으로 나는 그다지 익숙하지 않은 파이썬 (나는 C / C ++ 녀석이다.)을 확실히 보겠다.
Tonny

나는 C / C ++ 사람 이었지만 파이썬에는 "배터리가 포함되어있다"라는 정책이있다. C ++에 익숙하다면, 구문은 약간 다르지만 실제로 작업하게 될 것입니다.
Doktoro Reichard

난 그냥 전체 이진 비교에 대한 귀하의 의견을 읽고 안부 코드를 업데이 트되었습니다.
Doktoro Reichard

위에서 언급 한 fdupes 메서드를 이미 사용했지만 Python 프로그램을 확실히 살펴볼 것입니다. 어쨌든 파이썬에 익숙해지기를 원하며 실제로 공부할 실제 샘플 프로그램이 있다면 배우기가 쉽습니다. 책의 샘플은 종종 매우 인위적이며 큰 프로그램은 일반적으로 너무 복잡합니다. 이것은 크기면에서 관리 가능해야하며 실제 문제를 다루어야합니다.
Tonny

1

OSX 및 Linux 모두에서 실행해야하는 느리지 만 확실하고 간단한 방법입니다. 나는 당신이 당신의 파일에 중복 된 파일에 관심이 있다고 가정하고있다. $HOME 그러나 당신은 당신의 필요에 맞게 그것을 바꿀 수 있습니다.

처음에는 모든 디렉토리의 목록을 찾은 다음 그 안의 파일을 비교하고 동일한 디렉토리를 삭제합니다. 앞에서 말했듯이 이것은 매우 단순하기 때문에 모든 파일 쌍 중 첫 번째 파일을 유지하고 경고없이 나머지 파일을 삭제합니다.

이것은 속임수를 출력하지만 어떤 변경도하지 않을 것이다. 당신의 파일에 :

find $HOME  -mindepth 1 -type d | while read dir; do 
  find $dir -type -f -exec md5sum {} \; | sort > md5sums;
  gawk '{print $1}' md5sums | sort | uniq -d > dupes;
  while read d; do 
    echo "---"; grep -w $d md5sums | cut -d ' ' -f 2-;
  done < dupes
done; rm dupes md5sum 

이것은 자동으로 중복 파일을 삭제하고, 그것이 확실하다면 실행하십시오. :

find $HOME  -mindepth 1 -type d | 
while read dir; do 
  find $dir -type -f -exec md5sum {} \; | sort > md5sums;
  gawk '{print $1}' md5sums | sort | uniq -d |
  while read d; do grep -w $d md5sums | cut -d ' ' -f 2- | tail -n +2; done |
  | xargs rm ; 
done; rm dupes md5sum 

주의 사항 : 이것은 느리고 실제로는 느리며 경고를주지 않으며 파일을 자동으로 삭제합니다. 밝은면에서는 파일이 원하는 디렉토리와 동일한 디렉토리에있는 경우에만 그렇게합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.