fdupes -rdN보다 중복을 제거하는 더 세부적인 방법이 있습니까?

fdupes -rdN보다 중복을 제거하는 더 세부적인 방법이 있습니까?

최근에 중복 항목을 많이 제거해야 합니다. 3~4개의 파일 시스템을 병합하고 공간을 경제적으로 사용하고 싶습니다. 처음에는 fdupes작업에 가장 적합한 도구인 것처럼 보였지만 점점 한계에 부딪히고 있습니다.

순서를 고려하십시오 fdupes -rdN somedirectory/. 이는 디렉토리의 하위 디렉토리에 있는 모든 파일의 해시를 생성합니다.

중복 항목이 발견되면 모든 항목의 복사본이 하나만 있도록 삭제합니다.

하지만 somedirectory/subdirectory1/somefile유지하고 싶은데 실제로 4개의 중복 항목이 있고 프로그램이 중복 항목 중 하나를 먼저 발견하면 어떻게 될까요? 그런 다음 somedirectory/subdirectory1/somefile내가 원하지 않는 항목 을 삭제합니다 .

어떤 중복 항목을 유지할지 어떻게든 지정할 수 있었으면 좋겠습니다. 지금까지 중복 처리를 위한 표준 프로그램(duff, FSLint) 중 어느 것도 이 동작을 자동화하는 것을 허용하지 않는 것 같습니다. 제가 직접 하고 싶지 않아서 이런 질문을 드립니다.

다음과 같은 글을 쓸 수 있었으면 좋겠다

killdupes -rdN --keep=filesin,somedirectories,separated,by,commas somedirectory/

답변1

찾고 있는 기능이 재고가 없는 동안 fdupes포크했습니다.fdupes (내 포크 이름은 jdupes)그리고 경우에 따라 이 문제를 해결할 수 있는 몇 가지 기능을 추가했습니다. 예를 들어, somedirectory/subdirectory1/somefile중복 항목을 자동으로 제거할 때 유지( d및 함께 토글) N하고 아래에 별도의 파일이 없는 위의 경우 각 직접 하위 디렉터리 Path-에 somedirectory첫 번째 및 토글(명령을 통해 파일 정렬)을 제공할 수 있습니다. jdupes라인 매개변수 순서가 우선합니다):subdirectory1-O

jdupes -rdNO somedirectory/subdirectory1 somedirectory/subdirectory2 somedirectory/subdirectory3

이렇게 하면 중복 세트에서 하나의 파일을 제외한 모든 파일이 자동으로 제거되고 파일이 세트에 포함된 경우 해당 파일이 somedirectory/subdirectory1첫 번째 파일이 되어 자동으로 세트에 유지되는 파일이 됩니다. 이 접근 방식에는 somedirectory/subdirectory1유지하려는 것과 다른 복제본을 유지할 가능성과 같은 명백한 제한 사항이 여전히 있지만 귀하와 같은 많은 경우 jdupes인수 순서 옵션은 해결 방법으로 충분합니다.

가까운 시일 내에 파일 포함/제외, 작업 저장, 이러한 "필터 스택"의 적용을 전체적으로 또는 개별적으로 제어할 수 있는 필터링 시스템을 추가할 계획입니다. 매개변수 기준 jdupes. -N이 기능은 매우 필요합니다. 저는 "0이 아닌 중복 항목을 자동으로 재귀적으로 제거하되 항상 그대로 두는 somedirectory/subdirectory1/somefile" 것과 같은 기능을 구상합니다.

jdupes -rdN --filter=preserve:somedirectory/subdirectory1/somefile somedirectory/

업데이트(2022-03-01):-X2020년에 추가된 확장된 필터 옵션을 살펴보세요 . 이는 정확히 원하는 것은 아니지만 nostronlystr필터를 사용하면 무시하거나 요구하려는 전체 경로의 하위 문자열을 지정할 수 있습니다.

답변2

나는 이것을 다른 곳에서는 본 적이 없습니다. 당신이 원하는 것은 이것이라고 말하십시오. /mnt/folder-tree-1 /mnt/folder-tree-2가 있습니다. 중복된 파일을 모두 삭제하고 싶지는 않지만, 트리 2에 파일이 있고, 트리 1에도 동일한 파일이 동일한 경로와 이름으로 존재한다면 트리 2에서 삭제하세요.

경고: 이것은 매우 간결하므로 제한된 쉘 기술로 이것을 복사하여 붙여넣으려고 한다면 주의하십시오.

fdupes -rn /mnt/folder-tree-1/ /mnt/folder-tree-2/ > dupes-all.txt

fgrep /mnt/folder-tree-1/ dupes-all.txt | while read line
do
if grep -q "`echo $line | sed -e 's|^/mnt/folder-tree-1/|/mnt/folder-tree-2/|'`" dupes-all.txt
then
    echo rm \"$(echo $line | sed -e 's|^/mnt/folder-tree-1/|/mnt/folder-tree-2//|')\"
fi
done > rm-v2-dupes.sh

아니면 한 줄에 모두 작성하세요:

fdupes -rn /mnt/folder-tree-1/ /mnt/folder-tree-2/ > dupes-all.txt; fgrep /mnt/folder-tree-1/ dupes-all.txt | while read line; do if grep -q "`echo $line | sed -e 's|^/mnt/folder-tree-1/|/mnt/folder-tree-2/|'`" dupes-all.txt; then echo rm \"$(echo $line | sed -e 's|^/mnt/folder-tree-1/|/mnt/folder-tree-2/|')\"; fi; done > rm-v2-dupes.sh

그런 다음 rm-v2-dupes.sh를 확인하고 실행합니다.

답변3

중복 파일을 함께 하드 링크하는 것은 어떻습니까? 이렇게 하면 공백이 한 번만 사용되지만 여전히 모든 경로에 존재합니다. 문제는 하드 링크 파일을 그 자리에서 수정해야 한다는 것입니다(삭제된 파일만 수정하고 새 콘텐츠로 다시 만들 수 있음). 대안은 파일을 함께 심볼릭 링크하는 것입니다. 하지만 어떤 "기본" 파일을 결정하는 데에도 동일한 문제가 있습니다. 이는 다음 스크립트를 사용하여 수행할 수 있습니다(단, 공백이 포함된 파일 이름은 처리하지 않습니다).

fdupes --quiet --recurse --sameline somedirectory/ | while read SOURCE DESTS; do
    for DEST in $DESTS; do
        ln -f $SOURCE $DEST
    done
done

답변4

이전 답변에 트위스트를 추가하기 만하면됩니다. | grep삭제하려는 폴더를 간단히 격리하기 위해 이전 답변을 약간 수정하여 다음 코드를 여러 번 사용했습니다 .

`fdupes -r -n -S /directory | grep /delete-from-directory | sed -r "s/^/rm \"/" | sed -r "s/$/\"/" >remove-duplicate-files.sh`

이번에도 주석 줄 없이 나열된 모든 파일을 삭제하는 sh 파일이 생성됩니다. 물론 파일을 편집하여 유지하려는 특정 줄/파일을 주석 처리할 수도 있습니다.

대규모 디렉토리에 대한 또 다른 팁은 txt 파일에서 fdupes를 실행하고 원하는 결과를 얻을 | grep때까지 실험하는 것입니다.| sed

`fdupes -r -n -S /directory > duplicate-files.txt`
`cat duplicate-files.txt | grep /delete-from-directory | sed -r "s/^/rm \"/" | sed -r "s/$/\"/" >remove-duplicate-files.sh`

관련 정보