각 파일의 하드 링크를 사용하여 디렉토리를 재귀적으로 복사하는 방법

각 파일의 하드 링크를 사용하여 디렉토리를 재귀적으로 복사하는 방법

각 파일이 원본 파일에 대한 하드 링크인 디렉터리 트리의 "사본"을 만들고 싶습니다.

예: 다음과 같은 디렉터리 구조가 있습니다.

dirA/
dirA/file1
dirA/x/
dirA/x/file2
dirA/y/
dirA/y/file3

이는 각 파일이 원본에 대한 하드 링크인 디렉터리 트리의 "복사본"인 예상 결과입니다.

dirB/            #  normal directory
dirB/file1       #  hardlink to dirA/file1
dirB/x/          #  normal directory
dirB/x/file2     #  hardlink to dirA/x/file2
dirB/y/          #  normal directory
dirB/y/file3     #  hardlink to dirA/y/file3

답변1

Linux(보다 정확하게는 GNU 및 Linux를 커널로 사용하는 시스템에서 일반적으로 발견되는 busybox구현을 사용 cp) 및 최근 FreeBSD에서는 다음과 같습니다.

cp -al dirA dirB

보다 이식성이 뛰어난 솔루션은 pax 및 cpio를 사용한 Stéphane Chazelas의 답변을 참조하세요.

답변2

POSIXly에서는 pax읽기+쓰기 모드에서 다음 옵션을 사용할 수 있습니다 -l.

pax -rwlpe -s /A/B/ dirA .

( -peGNU처럼 복사된 파일의 가능한 모든 속성(이 경우에는 디렉토리만)을 유지하십시오 cp. -a)

지금은 그래도기준, 명령이 반드시 매우 중요한 것은 아닙니다.가지고 다닐 수 있는.

첫째, 많은 GNU/Linux 기반 시스템에는 기본적으로 이 유틸리티가 포함되어 있지 않습니다 pax(선택 사항이 아닌 POSIX 유틸리티임에도 불구하고).

그런 다음 일부 구현의 많은 버그와 부적합으로 인해 이 코드에 많은 문제가 발생합니다.

  • 버그로 인해 Solaris 10은 pax(적어도) -rwl와 함께 작동합니다 -s. 어떤 이유로 원래 경로와 복사된 경로 모두에 대체를 적용하는 것 같습니다. 그래서 위에서는 link("dirB/file", "dirB/file")대신에 뭔가를 하려고 시도할 것입니다 link("dirA/file", "dirB/file").
  • FreeBSD에서는 pax다음 유형의 파일에 대해 하드 링크가 생성되지 않습니다.심볼릭 링크(POSIX 허용 동작). 뿐만 아니라 심볼릭 링크의 대상에 대체를 적용합니다(동작아니요POSIX에서는 허용됩니다). 예를 들어 foo -> AA에 심볼릭 링크가 있으면 가 dirA됩니다 .foo -> BAdirB

$src또한 내용이 및 에 저장된 임의의 파일 경로로 동일한 작업을 수행 하려는 경우 내부의 전체 디렉터리 구조가 생성된다는 $dst점을 인식하는 것이 중요합니다 pax -rwl -- "$src" "$dst"(디렉토리가 있어야 하며 존재해야 함). 예를 들어 다음인 경우 생성합니다.$src$dst$srcfoo/bar$dst/foo/bar

$dst대신, 복사본이 되고 싶다면 $src가장 쉬운 방법은 다음과 같이 하는 것입니다.

absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && pax -rwlpe . "$absolute_dst")

(이것은 위에서 언급한 대부분의 문제도 해결하지만 $dst절대 경로가 개행 문자로 끝나면 실패합니다.)

이제 이 쌍은 그렇지 않습니다 pax.

흥미롭게도 POSIX는 병합 및 명령 기능을 위해 만들어졌습니다 pax.tarcpio

cpio역사적인Unix 명령(1977년 이후)은 POSIX 발명의 반대이며 GNU 구현도 있습니다( pax하나도 아님). 그러니 더 이상은 아니지만기준명령(SUSv2에 있음에도 불구하고)은 여전히 ​​일반적이며 일반적으로 의존할 수 있는 핵심 기능 세트를 가지고 있습니다.

동등합니다. pax -rwl하지만cpio -pl :

  1. cpio인수 대신 표준 입력으로 입력 파일 목록 가져오기(개행으로 구분됨, 즉 개행 문자가 있는 파일 이름은 지원되지 않음)
  2. 모든 파일(일반적으로 귀하가 제공하는 출력 find( 동일한 사람 findcpio공동 개발))을 지정해야 합니다.
  3. 메타데이터는 보존되지 않습니다(일부 cpio구현에서는 일부 메타데이터를 보존하도록 선택할 수 있지만 이식 가능한 것은 없습니다).

그래서 cpio:

absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && find . | cpio -pl "$absolute_dst")

답변3

짧은 답변:

cd $source_folder
pax -rwlpe . $dest_folder

답변4

그걸 찾고 계시다면하드 링크로 복사파일(전체 또는 일부)의 스냅샷 또는 백업을 만드는 기능을 확인하세요 rsnapshot.

관련 정보