it-swarm-ko.tech

중복 파일을 하드 링크로 바꾸는 쉬운 방법이 있습니까?

두 디렉토리에서 중복 파일을 찾고 한 디렉토리의 파일을 다른 디렉토리의 하드 링크로 바꾸는 쉬운 방법 (명령어 또는 일련의 명령, 아마도 find 포함)을 찾고 있습니다.

상황은 다음과 같습니다. 여러 사용자가 오디오 파일을 저장하는 파일 서버이며 각 사용자는 자신의 폴더를 가지고 있습니다. 때때로 여러 사람이 동일한 오디오 파일의 사본을 가지고 있습니다. 지금, 이들은 중복입니다. 하드 드라이브 공간을 절약하기 위해 하드 링크가되도록하고 싶습니다.

146
Josh

http://cpansearch.Perl.org/src/ANDK/Perl-Repository-APC-2.002/eg/trimtrees.pl 에 Perl 스크립트가 있습니다 :

명령 행에 이름이 지정된 모든 디렉토리를 탐색하고 MD5 체크섬을 계산하고 동일한 MD5를 가진 파일을 찾으십시오. 파일이 동일하면 실제로 동일하면 실제 비교를 수행하고 두 파일 중 두 번째 파일을 첫 번째 파일에 대한 하드 링크로 바꿉니다.

42
fschmitt

rdfind 요청한 내용을 정확하게 수행합니다 (및 순서 johny why 목록). 중복을 삭제하고 소프트 링크 또는 하드 링크로 교체 할 수 있습니다. symlinks와 결합하여 symlink를 절대 또는 상대로 만들 수도 있습니다. 체크섬 알고리즘 (md5 또는 sha1)을 선택할 수도 있습니다.

컴파일되어 있기 때문에 대부분의 스크립팅 된 솔루션보다 빠릅니다. time on 15 GiB 폴더에 반환)

9.99s user 3.61s system 66% cpu 20.543 total

(md5 사용).

대부분의 패키지 처리기 (예 : Mac OS X 용 MacPorts)에서 사용할 수 있습니다.

98
d-b

fdupes 도구를 사용하십시오.

fdupes -r /path/to/folder는 디렉토리의 중복 목록을 제공합니다 (-r은 재귀 적입니다). 결과는 다음과 같습니다.


filename1
파일 이름 2

filename3
파일 이름 4
파일 이름 5


filename1과 filename2는 동일하고 filename3, filename4와 filename5도 동일합니다.

51
tante

http://jak-linux.org/projects/hardlink/ 에서 hardlink를 사용합니다.

24
waltinator

이것은 "fslint"에서 제공하는 기능 중 하나입니다.- http://en.flossmanuals.net/FSlint/Introduction

"병합"버튼을 클릭하십시오 :

Screenshot

18
LJ Wobker

주요 목표는 디스크 공간을 절약하는 것이므로 파일 시스템 수준에서 중복 제거 (및 아마도 압축)와 같은 또 다른 솔루션이 있습니다. 하드 링크 솔루션과 비교하여 다른 링크 된 파일에 실수로 영향을주는 문제는 없습니다.

ZFS는 풀 버전 23 이후에 중복 제거 (파일 수준이 아니라 블록 수준)와 오래 전부터 압축되었습니다. Linux를 사용하는 경우 zfs-Fuse 를 시도하거나 BSD를 사용하는 경우 기본적으로 지원됩니다.

14
Wei-Yin

요즘 현대 리눅스에는 https://github.com/g2p/bedup btrfs 파일 시스템에서 중복을 제거하지만 1) 스캔 오버 헤드없이 2) 파일을 쉽게 분기 할 수 있습니다 나중에 다시.

7
Matthew Bloch
aptitude show hardlink

설명 : 동일한 파일의 여러 복사본을 하드 링크로 연결 하드 링크는 같은 파일의 여러 복사본을 감지하여 하드 링크로 대체하는 도구입니다.

이 아이디어는 http://code.google.com/p/hardlinkpy/ 에서 가져 왔지만 코드는 처음부터 작성되었으며 MIT 라이센스 홈페이지 : http://jak-linux.org/projects/hardlink/

6
Julien Palard

중복 파일을 찾으려면 duff를 사용할 수 있습니다.

Duff는 주어진 파일 세트에서 중복을 빠르게 찾을 수있는 Unix 명령 줄 유틸리티입니다.

간단히 실행하십시오.

duff -r target-folder

해당 파일에 대한 하드 링크를 자동으로 만들려면 duff 의 출력을 bash 또는 다른 스크립팅으로 구문 분석해야합니다. 언어.

6
Stefan

여기에 언급 된 Linux 용 많은 하드 링크 도구를 사용했습니다. 나도 우분투에서 ext4 fs에 붙어 있으며 하드/소프트 링크를 위해 cp -ls을 사용하고 있습니다. 그러나 최근 cp 매뉴얼 페이지에서 경량 복사를 발견했습니다. 중복 디스크 공간을 절약 할 수 있음을 의미합니다 until 한쪽이 수정됩니다.

   --reflink[=WHEN]
          control clone/CoW copies. See below

       When  --reflink[=always]  is specified, perform a lightweight copy, where the 
data blocks are copied only when modified.  If this is not possible the
       copy fails, or if --reflink=auto is specified, fall back to a standard copy.
4
Marcos

jdupes는 댓글에 언급되었지만 대부분의 배포판에서 사용 가능하고 꽤 빠르기 때문에 (98 %% 전체 158 GB 파티션 (SSD 드라이브) 2.7GB를 약 2.7GB 여유) 1 분) :

jdupes -rL /foo/bar

파일 이름을 먼저 확인하면 속도가 빨라질 것 같습니다. 두 파일에 동일한 파일 이름이 없으면 많은 경우에 파일이 중복 된 것으로 간주하지 않습니다. 가장 빠른 방법은 순서대로 비교하는 것 같습니다.

  • 파일 이름
  • 크기
  • md5 체크섬
  • 바이트 내용

어떤 방법을 사용합니까? duff, fdupes, rmlint, fslint 등을보십시오.

다음 방법은 commandlinefu.com 에 투표되었습니다. 중복 파일 찾기 (먼저 크기를 기준으로 한 다음 MD5 해시)

파일 이름 비교를 첫 번째 단계로 추가하고 크기를 두 번째 단계로 추가 할 수 있습니까?

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
4
johny why

나는 Perl의 팬이 아니기 때문에 bash 버전이 있습니다.

#!/bin/bash

DIR="/path/to/big/files"

find $DIR -type f -exec md5sum {} \; | sort > /tmp/sums-sorted.txt

OLDSUM=""
IFS=$'\n'
for i in `cat /tmp/sums-sorted.txt`; do
 NEWSUM=`echo "$i" | sed 's/ .*//'`
 NEWFILE=`echo "$i" | sed 's/^[^ ]* *//'`
 if [ "$OLDSUM" == "$NEWSUM" ]; then
  echo ln -f "$OLDFILE" "$NEWFILE"
 else
  OLDSUM="$NEWSUM"
  OLDFILE="$NEWFILE"
 fi
done

체크섬이 같은 모든 파일 (큰 파일이든 작은 파일이든 이미 하드 링크 된 파일인지)을 찾아서 서로 하드 링크합니다.

이것은 추가 찾기 플래그 (예 : 크기)와 파일 캐시 (매번 체크섬을 다시 실행할 필요가 없음)를 사용하여 반복 실행에 크게 최적화 될 수 있습니다. 더 똑똑하고 더 긴 버전에 관심이있는 사람은 게시 할 수 있습니다.

NOTE : 앞에서 언급했듯이 하드 링크는 파일을 수정할 필요가 없거나 파일 시스템간에 이동할 수있는 한 작동합니다.

3
seren

Mac 또는 UNIX 기반 시스템에서 하드 링크로 복제본을 바꾸려면 SmartDupe http://sourceforge.net/projects/smartdupe/ 개발 중입니다.

1
islam

나는 당신이 말하는 것과 비슷한 것을하는 Perl 스크립트를 만들었습니다.

http://Pastebin.com/U7mFHZU7

기본적으로 디렉토리를 통과하여 파일의 SHA1sum을 계산하고 해시하고 일치시키는 링크를 만듭니다. 많은 경우에 편리합니다.

1
amphetamachine

응용 프로그램 FSLint ( http://www.pixelbeat.org/fslint/ )는 모든 폴더에서 동일한 내용의 모든 파일을 찾고 (내용 별) 하드 링크를 만들 수 있습니다. 시도 해봐!

호르헤 삼 파이오

1

하드 링크는 최선의 아이디어가 아닐 수도 있습니다. 한 사용자가 파일을 변경하면 둘 다에 영향을줍니다. 그러나 하드 링크를 삭제해도 두 파일이 모두 삭제되지는 않습니다. 또한 하드 링크가 동일한 파일의 여러 복사본과 동일한 양의 공간 (OS가 아닌 하드 디스크에서)을 차지하는지 확실하지 않습니다. Windows에 따르면 (Link Shell Extension 사용) 그렇게합니다. 물론 유닉스가 아닌 Windows입니다.

내 해결책은 숨겨진 폴더에 "공통"파일을 만들고 실제 복제본을 심볼릭 링크로 바꾸는 것입니다. 그러면 심볼릭 링크는 메타 데이터 또는 두 개의 "파일"만 기록하는 대체 파일 스트림에 포함됩니다 한 사람이 파일 이름을 변경하거나 사용자 지정 앨범 아트 또는 이와 유사한 것을 추가하려는 경우와 같이 서로 다릅니다. 심지어 동일한 게임이나 소프트웨어의 여러 버전을 설치하고 아주 작은 차이로 독립적으로 테스트하는 것과 같이 데이터베이스 응용 프로그램 외부에서도 유용 할 수 있습니다.

0
Amaroq Starwind

하드 링크를 수행 할 경우 해당 파일의 권한에주의하십시오. 통지, 소유자, 그룹, 모드, 확장 된 속성, 시간 및 ACL (사용하는 경우)은 INODE에 저장됩니다. 파일 이름은 디렉토리 구조에 저장되고 다른 이름은 INODE 속성을 나타 내기 때문에 다릅니다. 이로 인해 동일한 inode에 연결된 모든 파일 이름은 동일한 액세스 권한을 갖습니다. 모든 사용자가 다른 사용자에게 파일을 손상시킬 수 있으므로 해당 파일을 수정하지 않아야합니다. 간단하다. 다른 사용자가 같은 이름으로 다른 파일을 넣는 것으로 충분합니다. 그런 다음 Inode 번호가 저장되고 모든 하드 링크 이름에 대해 원본 파일 내용이 삭제 (대체)됩니다.

더 좋은 방법은 파일 시스템 계층에서 중복 제거입니다. BTRFS (최종 인기), OCFS 등을 사용할 수 있습니다. https://en.wikipedia.org/wiki/Comparison_of_file_systems 페이지의 특징 및 열 데이터 중복 제거 표를 참조하십시오. 당신은 그것을 클릭하고 정렬 할 수 있습니다 :)

특히 ZFS 파일 시스템을 살펴보십시오. 이것은 퓨즈로 사용할 수 있지만 이런 식으로 매우 느립니다. 기본 지원을 원하면 http://zfsonlinux.org/ 페이지를보십시오. 그런 다음 커널을 패치하고 다음으로 관리를 위해 zfs 도구를 설치해야합니다. 리눅스가 드라이버로 지원하지 않는 이유를 이해하지 못합니다. 다른 많은 운영 체제/커널에 적합합니다.

파일 시스템은 두 가지 방법으로 중복 제거, 파일 중복 제거 또는 블록을 지원합니다. ZFS는 블록을 지원합니다. 즉, 동일한 파일에서 반복되는 동일한 내용을 중복 제거 할 수 있습니다. 다른 방법은 데이터가 중복 제거되는 시간이며 온라인 (zfs) 또는 오프라인 (btrfs) 일 수 있습니다.

중복 제거는 RAM을 소비합니다. 이것이 퓨즈로 마운트 된 ZFS 볼륨에 파일을 쓰면 성능이 크게 저하되는 이유입니다. 이것은 설명서에 설명되어 있습니다. 그러나 볼륨에 대한 온라인 중복 제거를 설정하거나 해제 할 수 있습니다. 중복 제거가 필요한 데이터가 있으면 중복 제거를 설정하고 일부 파일을 임시 파일로 다시 작성한 후 대체하십시오. 이 후 중복 제거를 해제하고 전체 성능을 복원 할 수 있습니다. 물론 캐시 디스크를 스토리지에 추가 할 수 있습니다. 이것은 매우 빠른 회전 디스크 또는 SSD 디스크 일 수 있습니다. 물론 이것은 매우 작은 디스크 일 수 있습니다. 실제 작업에서 이것은 RAM :)을 대체합니다.

리눅스에서는 파일 시스템 관리, 스냅 샷 생성 등을 할 때 모든 것이 제대로 작동하지는 않지만 ZFS를주의해야하지만 구성을 수행하고 변경하지 않으면 모든 것이 올바르게 작동합니다. 다른 방법으로, 당신은 리눅스를 opensolaris로 바꾸어야한다. 그것은 기본적으로 ZFS를 지원한다. ZFS를 사용할 때는 필요하지 않습니다. 자세한 내용은 설명서를 참조하십시오.

ZFS와 BTRFS의 차이점에 유의하십시오. ZFS는 불행히도 Solaris와 OpenSolaris (아쉽게도 Oracle에 의해 교살 됨)에서만 구식이고 성숙되었습니다. BTRFS는 더 젊지 만, 마지막에는 아주 잘 지원됩니다. 나는 새로운 커널을 추천한다. ZFS에는 온라인 중복 제거 기능이있어 쓰기 속도가 느려집니다. 모두 온라인으로 계산되기 때문입니다. BTRFS는 오프라인 중복 제거를 지원합니다. 그러면 성능이 절약되지만 호스트에 수행 할 작업이 없으면 중복 제거를 위해 정기적으로 도구를 실행합니다. 그리고 BTRFS는 기본적으로 리눅스에서 만들어집니다. 어쩌면 이것이 더 좋습니다 FS 당신을 위해 :)

0
Znik

가장 쉬운 방법은 특별한 프로그램을 사용하는 것입니다.

dupeGuru Preferences Screenshot

documentation 라고

삭제 옵션

이 옵션은 중복 삭제가 수행되는 방식에 영향을줍니다. 대부분의 경우 이들을 활성화 할 필요가 없습니다.

삭제 된 파일 링크 :

삭제 된 파일은 참조 파일에 대한 링크로 대체됩니다. 심볼릭 링크 또는 하드 링크로 대체 할 수 있습니다. ... 심볼릭 링크는 파일 경로의 바로 가기입니다. 원본 파일이 삭제되거나 이동되면 링크가 끊어집니다. 하드 링크는 파일 자체에 대한 링크입니다. 이 링크는 "실제"파일만큼 좋습니다. 파일에 대한 모든 하드 링크가 삭제 된 경우에만 파일 자체가 삭제됩니다.

OSX 및 Linux에서이 기능은 완전히 지원되지만 Windows에서는 약간 복잡합니다. Windows XP는 지원하지 않지만 Vista 이상은 지원하지만 기능이 작동하려면 dupeGuru가 관리자 권한으로 실행되어야합니다.