하드 링크를 유지하면서 디렉토리를 복사하는 방법은 무엇입니까?


40

공통 파일이있는 디렉토리를 다른 파티션으로 옮기는 방법은 무엇입니까?

/mnt/X하드 링크로 파일을 공유하는 디렉토리로 파티션을 마운트했다고 가정 해 봅시다 . 그러한 디렉토리를 다른 파티션으로 옮기는 방법은 /mnt/Y하드 링크를 보존하는 것입니다.

더 나은 설명을 위해 "하드 링크와 공통으로 파일을 공유하는 디렉토리"의 의미는 다음과 같습니다.

# let's create three of directories and files
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
# and copy it with hardlinks
cp -r -l a hardlinks_of_a

좀 더 구체적으로 말하면 파일의 총 크기는 10G이고 각 파일에는 10 개의 하드 링크가 있다고 가정합니다. 문제는 10G를 사용하여 대상으로 이동하는 방법입니다 (100G로 복사 한 다음 중복 제거를 실행하는 것에 대해 말할 수 있습니다-내가 묻는 것이 아닙니다)

답변:


29

첫 번째 답변 : GNU Way

GNU cp -a는 가능한 많은 구조와 메타 데이터를 재귀 적으로 보존합니다. 소스 디렉토리에있는 파일들 간의 하드 링크가 여기에 포함됩니다. 다른 모든 기능없이 하드 링크 보존을 선택하려면을 -a사용하십시오 --preserve=links.

mkdir src
cd src
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
cp -r -l a hardlinks_of_a
cd ..
cp -a src dst

3
tar에 +1, cp에 gnu 관련 인수를 사용하는 경우 -1
WhyNotHugo

당신은 하나에 세 가지 답변을 주었다. 그것들을 3 개로 나누면 별도로 주석을 달고 평가할 수 있습니까? (도움말 : "cp -a"와 같이 하나만 남겨 두도록 편집 할 수 있습니다. 나중에 "tar"와 "pax"에 대해 두 개 더 추가)
Grzegorz Wierzowiecki

1
@GrzegorzWierzowiecki 분할 달성
Alan Curry

6
@ Hugo : 표준 도구에 GNU 관련 인수를 사용하는 데 아무런 문제가 없습니다. 요즘 GNU 버전은 사실상의 표준이며, 사전 설치되어 있지 않더라도 GNU 도구를 설치하는 것이 일반적인 관행이었습니다 (저는 항상 그렇습니다-예를 들어 solaris 및 * bsd 버전보다 더 좋았습니다) 서로 다른 * nix간에 일관성을 제공했습니다). GNUism을 사용할 때 꼭 필요한 것은 아니지만이를 지적하는 것이 좋습니다. 또한 Grzegorz는 "리눅스에 있지 않다"고 말하지 않았으므로 이것이 그가 말하는 환경이라고 가정하는 것이 합리적입니다.
cas

1
@WhyNotHugo : POSIX는 어떻게 "표준화 될 수 있습니까?" POSIX는 우리를 어디로 데려 갔는가입니다. Windows NT 이후의 모든 Windows 버전이 POSIX와 완벽하게 호환된다는 것을 알고 있습니까? POSIX 파일 I / O 기능을 사용할 때 경로 길이 제한이 255 자로 제한되어있어 쓸모가 없습니다. Solaris, Irix, HP-UX는 모두 POSIX를 준수하지만 도구에 대한 모든 인수가 다릅니다 (예 : tar). cp -a는 GNU 사본을 대체하려는 모든 cp 버전의 최소 요구 사항입니다.
Johannes Overmann

36

rsync에는 이것에 대한 -H또는 --hard-links옵션이 있으며, 이전 rsync 중 / 이후에 변경된 파일을 효율적으로 처리하기 위해 중지하고 다시 시작하고 다시 실행하는 일반적인 rsync 이점이 있습니다.

-H, --hard-links
    This tells rsync to look for hard-linked files in
    the source and link together the corresponding
    files on the destination.  Without  this option,
    hard-linked files in the source are treated as
    though they were separate files. [...]

rsync매뉴얼 페이지를 읽고 -H를 검색하십시오. 특정 경고에 대한 자세한 내용이 있습니다.


2
확인했습니다-작동합니다.
Grzegorz Wierzowiecki

그래, 알아 나는 백업 스크립트에서 수년 동안 그것을 사용 해왔다. 또한 귀하의 질문에 따라 파일 시스템간에 파일을 이동하십시오.
cas

rsync는 파일 목록을 작성할 때 메모리 덩어리를 사용합니다. 여러 시간 동안 "빌딩 파일 목록 ..."을 수행 한 후 16GB의 메모리를 채우고 아무것도 복사하지 않은 채 숨이 막혔습니다. YMMV.
msc

2
From man rsync: rsync 3.0.0부터 사용되는 재귀 알고리즘은 이제 이전보다 훨씬 적은 메모리를 사용하고 처음 몇 디렉토리의 스캔이 완료된 후 전송을 시작하는 증분 스캔입니다. 이 증분 스캔은 재귀 알고리즘에만 영향을 미치며 비 재귀 전송은 변경하지 않습니다. 전송의 양쪽 끝이 버전 3.0.0 이상인 경우에만 가능합니다. 이 개선 된 알고리즘 을 모두 비활성화 --delete-before하고 --delete-after비활성화하십시오.
cas

또한 rsync매우 유용하지만 모든 작업에 항상 최고의 도구는 아닙니다. 요즘에는 ZFS 데이터 세트를 사용하여 스냅 샷을 만들 수 있습니다 zfs send.ZFS가 아닌 파일 시스템에서는 주로 rsync를 사용합니다. btrfs비슷한 스냅 샷 + 전송 기능이 있습니다.
cas

14

세 번째 답변 : POSIX Way

POSIX는 아카이브 형식 tar을 표준화했지만 유틸리티를 표준화하지 않았습니다 tar. tar 아카이브를 조작하기위한 POSIX 유틸리티가 호출 pax되며 단일 프로세스에서 팩 및 압축 풀기 작업을 수행 할 수있는 보너스 기능이 있습니다.

mkdir dst
pax -rw src dst

10

두 번째 답변 : 고대 유닉스 길

소스 디렉토리에 tar 아카이브를 작성하고 파이프를 통해 전송 한 후 대상 디렉토리에서 압축을 푸십시오.

# create src as before
(cd src;tar cf - .) | (mkdir dst;cd dst;tar xf -)

1
확인-> 작동합니다. 하드 링크가 보존되었습니다.
Grzegorz Wierzowiecki

1
이것이 실제로 하드 링크를 보존하는 이유에 대한 통찰력이 있습니까?
peterph

1
때문에 tar보존 하드 링크. GNU tar에서 최소한 다음과 --hard-dereference
같이이

필자의 경우 큰 디렉토리 계층 (TimeMachine 백업)을 복사하려고 시도하면 tar는 일부 하드 링크를 보존했지만 경우에 따라 파일을 복제했습니다. tar x파일이 여전히에서 파이프 인되어 있기 때문에 전체 파일 목록 이 없기 때문이라고 생각 합니다 tar c. 압축을 풀기 전에 전체 아카이브를 저장 한 경우에는 문제가 없습니다. 누군가 그 이론을 확인할 수 있다면 매우 기쁠 것입니다.
msc February

10

출처 : http://www.cyberciti.biz/faq/linux-unix-apple-osx-bsd-rsync-copy-hard-links/

정확한 사본을 만들기 위해 필요한 것은

rsync -az -H --delete --numeric-ids /path/to/source/ /path/to/dest/

위의 rsync에 대한 내 의견을 참조하십시오.
msc

1
이것이 ACL, 확장 속성 등을 복사하지 않을 것으로 생각됩니다. 리눅스 버전에는이를 보존하기위한 -A 및 -X 옵션도 있지만 MacOS에서는 운이 좋지 않다고 생각합니다.
Edward Falk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.