각 파일이 원본 파일에 대한 하드 링크인 디렉터리 트리의 "사본"을 만들고 싶습니다.
예: 다음과 같은 디렉터리 구조가 있습니다.
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 .
( -pe
GNU처럼 복사된 파일의 가능한 모든 속성(이 경우에는 디렉토리만)을 유지하십시오 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 -> BA
dirB
$src
또한 내용이 및 에 저장된 임의의 파일 경로로 동일한 작업을 수행 하려는 경우 내부의 전체 디렉터리 구조가 생성된다는 $dst
점을 인식하는 것이 중요합니다 pax -rwl -- "$src" "$dst"
(디렉토리가 있어야 하며 존재해야 함). 예를 들어 다음인 경우 생성합니다.$src
$dst
$src
foo/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
.tar
cpio
cpio
는역사적인Unix 명령(1977년 이후)은 POSIX 발명의 반대이며 GNU 구현도 있습니다( pax
하나도 아님). 그러니 더 이상은 아니지만기준명령(SUSv2에 있음에도 불구하고)은 여전히 일반적이며 일반적으로 의존할 수 있는 핵심 기능 세트를 가지고 있습니다.
동등합니다. pax -rwl
하지만cpio -pl
:
cpio
인수 대신 표준 입력으로 입력 파일 목록 가져오기(개행으로 구분됨, 즉 개행 문자가 있는 파일 이름은 지원되지 않음)- 모든 파일(일반적으로 귀하가 제공하는 출력
find
( 동일한 사람find
이cpio
공동 개발))을 지정해야 합니다. - 메타데이터는 보존되지 않습니다(일부
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
.