심볼릭 링크를 복사하는 방법?


180

심볼릭 링크가 포함 된 디렉토리가 있습니다.

user@host:include$ find .. -type l -ls
4737414    0 lrwxrwxrwx   1 user group       13 Dec  9 13:47 ../k0607-lsi6/camac -> ../../include
4737415    0 lrwxrwxrwx   1 user group       14 Dec  9 13:49 ../k0607-lsi6/linux -> ../../../linux
4737417    0 lrwxrwxrwx   1 user group       12 Dec  9 13:57 ../k0607-lsi6/dfc -> ../../../dfc
4737419    0 lrwxrwxrwx   1 user group       17 Dec  9 13:57 ../k0607-lsi6/dfcommon -> ../../../dfcommon
4737420    0 lrwxrwxrwx   1 user group       19 Dec  9 13:57 ../k0607-lsi6/dfcommonxx -> ../../../dfcommonxx
4737421    0 lrwxrwxrwx   1 user group       17 Dec  9 13:57 ../k0607-lsi6/dfcompat -> ../../../dfcompat

현재 디렉토리로 복사해야합니다. 결과 링크는 프로토 타입과 독립적이어야하며 대상 오브젝트로 직접 연결되어야합니다.

  • cp -s 적절한 동작이 아닌 링크에 대한 링크를 만듭니다.
  • cp -s -L 디렉토리에 대한 링크 복사를 거부합니다
  • cp -s -L -r 작동하지 않는 디렉토리에 대한 상대 링크 복사를 거부합니다.

어떻게해야합니까?


10
cp -d내 편에 일을했다.
m-ric

2
cp -RMac에서
Mirko

답변:


201
cp --preserve=links

매뉴얼 페이지에서 :

   --preserve[=ATTR_LIST]
          preserve  the   specified   attributes   (default:   mode,owner-
          ship,timestamps),  if  possible  additional attributes: context,
          links, xattr, all

개인적으로, 나는 cp -av 대부분의 무거운 복사에 사용합니다. 이렇게하면 모든 것을 재귀 적으로 유지하고 결과를 볼 수 있습니다. 물론 그것은 개인적인 취향 일뿐입니다.

다른 옵션은 당신이 무엇을 기대하지 않는 이유에 관해서는, -s링크를 만드는 대신 복사 및 -L링크 자체를 복사하는 대신 복사 할 파일을 찾기 위해 소스의 링크를 다음과 같습니다.


3
-R그렇지 않으면 cp가 디렉토리를 건너 뛰고 디렉토리에 대한 심볼릭 링크를 추가 하므로을 추가해야 할 수도 있습니다 .
Olivier 'Ölbaum'Scherler

8
Redhat

41
Mac에서? 사용cp -a
스티브 타우 버

11
-a옵션 은 +1입니다 . 허, 나는 cp맨 페이지에서 무수한 시간에 옵션을 찾아 보았지만 항상이 옵션을 넘어서야했다. 나는 지금까지를 사용 -dpr하고 있었지만 -a모든 것을 포함하고 몇 가지 다른 속성을 보존했습니다. 이 다른 속성이 필요하다면 --preserve옵션을 다시 -dr --preserve=all찾아서 사용했을 것 -a입니다. 적어도 나는 지금 알고있다 – -a완전하다. 그리고 이것은 내가 지금부터 사용할 것이다.
James Haigh

3
Cygwin에서는 작동하지 않았습니다. --preserve=links충분하지 않았습니다. 여전히 말했다 cp: omitting directory. 그러나 -av일했다.
Chloe

44

매뉴얼 페이지에서 알 수 있듯이을 사용하십시오 -P.


8
Mac -P에서는 디렉토리에서 작동하지 않으므로 내가 사용한 디렉토리cp -a
Steve Tauber

4
고마워, 나는 당신의 대답을 1 년에 걸쳐 3 번 다른 시간을보고 보았습니다. 기억이 안나 네요!
Siddhartha

이것은 작동하지만 내 매뉴얼 페이지에는 "-P는 소스의 심볼릭 링크를 절대로 따르지 않습니다"라고 표시되어 있습니다. 이는 대상에 대한 심볼릭 링크로 심볼릭 링크를 복사하는 것과 직관적으로 동일하지 않습니다. ( "never follow"는 -R과 함께 작동하는 것처럼 들립니다)
RM

이것은 cp -P@kainosnous의 최고 투표 답변과 달리 저에게 효과적입니다. 감사!
tommy.carstensen

Redhat에서 작동합니다. 허용 된 응답이 작동하지 않습니다!
Phiber

29

링크에 상대 경로가 포함되어 있으면 링크를 복사해도 상대 경로가 조정되지 않습니다. 링크의 절대 경로를 얻으려면 readlink스위치 -f를 재귀 적으로 따라 가려면을 사용하십시오 . 예를 들면 다음과 같습니다.

ln -s $(readlink -f old/dir/oldlink) new/dir/newlink

상대 경로를 유지하는 것은 당신이 옵션보다는, 원하는 경우 -Pcp같은 이그나시오 바스케스 - 에이 브람스 말했다, 당신이 필요로하는 것입니다.


1
심볼릭 링크를 절대에서 절대로 변환하는 것만으로 재귀 적으로 역 참조하는 것이 좋지 않을 수 있습니다. 재귀는 여기에 필요하지 않으며 때로는 체인으로 연결된 심볼릭 링크가 이유가 있습니다. 심볼릭 링크는 종종 선택 사항 또는 구성 옵션을 지정하는 데 사용됩니다. 예를 들어, 내 시스템에는 /usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-english선호하는 사전을 지정 하는 symlink chain 이 있습니다. 이 체인을 재귀 적으로 역 참조 할 경우 결과 symlink는이 환경 설정에 대한 향후 변경 사항을 무시합니다.
James Haigh

24

몇 사람이 논평했다 :

cp -a 

잘 작동합니다.

남자에게서 :

-a    same as -dR --preserve=all

-R    copy directories recursively
-d    same as --no-dereference --preserve=links
--no-dereference   never follow symbolic links in SOURCE

3
...하지만 상대 경로에 대한 심볼릭 링크가없는 경우에만 해당됩니다.
Michael Scheper 2016 년

11

다음을 사용하여 실제로 큰 디렉토리를 복제했습니다. 모든 심볼릭 링크가 유지되고 복사가 재귀 적으로 수행되었으며 프로세스에 대한 시각적 피드백을 얻을 수있었습니다.

cp -Prv /sourcer_dir/* /target_dir

10

대부분의 경우 많은 심볼릭 링크를 복사해야 할 때 실제로 디렉토리 트리를 미러링하려고합니다. 그래서 심볼릭 링크와 다른 모든 것을 원합니다.

이것은 몇 개의 심볼릭 링크를 복사하는 데 과잉이지만 실제로 전체 트리를 복사하려는 경우 매우 유용 할 수 있습니다.

tar를 사용하십시오 .

user@host:/cwd$ ( cd /path/to/src ; tar cf - . ) | ( cd /path/to/dest ; tar xf - )

tar 는 기본적으로 심볼릭 링크를 해결하지 않으므로 미러 사본의 심볼릭 링크는 원래 트리의 심볼릭 링크와 동일한 위치를 가리 킵니다.

이 트릭은 서브 쉘을 사용하여 tar 명령이 미러링 될 디렉토리의 루트 위치에 놓 이도록합니다. 이미 src 또는 dest 디렉토리 에있는 경우 관련 cd 명령 과 함께 이들 중 하나를 그대로 둘 수 있습니다 .

# already in src?
user@host:/src$ tar cf - . | ( cd /path/to/dest ; tar xf - )

# already in dest?
user@host:/dest$ ( cd /path/to/src ; tar cf - . ) | tar xf - 

# just need src/foo?
# this result will be a mirror copy at dest/foo 
user@host:/src$ tar cf - foo | ( cd /path/to/dest ; tar xf - )

# mirror to another system?
user@host:/src$ tar cf - . | ssh user@example.com '( cd /path/to/dest ; tar xf - )'

다시 한 번, 이것은 심볼릭 링크를 복사 할 때마다 적합하지 않지만 매우 유용한 스 니펫입니다.


1
타르는 내 경험에서 CP에 비해 확실히 더 휴대용
밝은 돈

4

시도 : cp -pr symlink 대상

[root@station1 temp]# ls -l
total 8
-rw-r--r-- 1 root root  0 Jul 27 18:40 abc
lrwxrwxrwx 1 root root 13 Jul 27 18:41 abc.link1 -> /tmp/temp/abc
[root@station1 temp]# cp -rp /tmp/temp/abc.link1 /tmp/temp/abc.link2
[root@station1 temp]# ls -l
total 12
-rw-r--r-- 1 root root  0 Jul 27 18:40 abc
lrwxrwxrwx 1 root root 13 Jul 27 18:41 abc.link1 -> /tmp/temp/abc
lrwxrwxrwx 1 root root 13 Jul 27 18:42 abc.link2 -> /tmp/temp/abc
[root@station1 temp]# 

OS-Centos 5 (Linux)


3

디렉토리에서 링크와 파일을 복사 할 때 우분투에서 :

cp --no-dereference --preserve=links

5
cp -d이에 대한 속기
hunse

1
나는 모두를 생각 cp -a하고 cp --preserve=links질문보다 더 부탁하면됩니다. 내가 이해하는 것처럼 이것은 질문을하는 cp것처럼 파일 만 (디렉토리 --no-dereference없음) 효과가 없지만을 사용하는 사람에게는 정답입니다 .
palswim

2

-PIgnacio Vazquez-Abrams 가 위에서 쓴 것처럼 옵션을 사용하십시오 . 그가 언급하지 않은 것은 -P없이는 효과가 없습니다 -R. 그래서 당신은 적어도 필요합니다 cp -RP.

(사이트에서 아직 댓글을 달 수 없으므로 별도의 답변을 게시했습니다.)


오래된 solaris 상자에서 내 cp는 -d를 지원하지 않습니다. cp -rP가 나를 위해 일했습니다. (-R과 -r 사이의 차이를 식별하면 -r이 나를 위해 일합니다).
spioter

1

cp -s 및 cp -L은 특수 명령입니다. 요구 사항에 대해서는 none을 사용하십시오.

예를 들어 a 및 a를 가리키는 기호 링크 b를 포함하는 디렉토리 DIR 복사

  • cp -s DIR / * N /은 복사 대신 기호 링크를 작성합니다. N / a-> ../ DIR / a (링크) 및 N / b-> (../ DIR / b)는 링크에 대한 링크입니다.
  • cp -L DIR / * N / 링크 역 참조가있는 사본, N / a, N / b (DIR / a와 동일)

필요한 것은 N / a (= DIR / a) 및 N / b-> ../ N / a입니다. cp -P 옵션을 사용하여 역 참조없이 복사하면됩니다. 나는 이것이 또한 cp의 기본값이라고 생각합니다.

  • -P 참조 해제, 링크 유지
  • -d는 -P 옵션과 -p를 결합하여 보존, 모드, 소유권, 타임 스탬프를 유지합니다.
  • -a는 -d 옵션과 -R을 결합하여 재귀 적으로 디렉토리를 복사합니다.

man cp또는 cp --help추가 옵션을 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.