2009-08-06 4 views
19

디렉토리 계층 구조를 "복사"하여 모든 "파일"이 소스 계층 구조의 실제 파일을 가리키는 심볼릭 링크 일뿐 아니라 디렉토리의 새로운 계층 구조가 작성되는 가장 간단한 방법은 무엇입니까?symlink- 디렉토리 계층 구조 복사

cp -s은 재귀 적으로 작동하지 않습니다. 원래 & 새로운 디렉토리 위에서 시작

+0

http://unix.stackexchange.com/q/196537/10047도 참조하십시오. – user905686

답변

1

나는 조금 돌아 다니며 here에서 사용할 수있는 lns이라는 명령을 발견했습니다.

+0

이 도구는 저에게 효과적입니다. 그것을 지적 주셔서 감사합니다! –

+0

일부 옵션 (2)이있는 cp가 트릭을 수행하는 경우 타사 도구를 권하는 이유는 무엇입니까? 나에게 보안상의 위험이있는 것 같아. – Nikodemus

+0

8 년 전 내가 대답을 썼을 때 나는 -s 옵션에 대해 몰랐다. 대답이 좋거나 나쁘다면 upvote/downvote를 사용해보십시오. – JesperE

11

, 내가 find(1) 명령이 쌍은 당신이 필요로 할 것입니다 생각 :

find original -type d -exec mkdir new/{} \; 
find original -type f -exec ln -s {} new/{} \; 

첫 번째 인스턴스가 원래의 트리에서만 디렉토리를 찾아 디렉토리 구조를 설정하고 새로운 나무에서 그들을 재현하십시오. 두 번째는 새 트리의 원본 파일에 대한 심볼릭 링크를 만듭니다.

+0

이것은 나를 위해 매우 잘 작동합니다 (위에서 설명한 것처럼 cp -as 또는 -R은 Mac OS X에서 작동하지 않습니다). mkdir과 ​​ln -s에 대한 매개 변수로서 상대 경로를 얻기 위해'(cd origParentDir; origDir .. find; origDir ..)'명령을 사용하는 것이 좋습니다. 서브 쉘에서 cd를 실행하면 임시로 CWD 만 설정되기 때문에 parantheses를 사용하여'('subshell')을 시작하십시오; CWD는 서브 쉘이 종료 될 때 복원됩니다. 예 : '/ src/binutils-2.24'를'$ {HOME}/source'에 '복제'한다면''src' '폴더를 생성하고 싶지 않을 것입니다. –

+0

'ln'은'ln -s -R orig/dir dest/dir'과 같은 재귀 적 옵션을 가지고 있지 않습니다. – jiggunjer

26

나는 단지 리눅스 박스에서 빠른 테스트를 수행했으며 cp -sR /orig /dest은 당신이 묘사 한대로 정확하게 수행한다 : 디렉토리가 아닌 디렉토리에 원래의 디렉토리 구조를 갖는 디렉토리 계층 구조를 만든다.

+0

첫 번째 디렉토리 레벨에서만 작동합니다. 하위 디렉토리의 모든 파일에 대해 "xyz-file : 현재 디렉토리에서만 상대적인 심볼릭 링크를 만들 수 있습니다". (우분투 8.10에서, cp 버전 6.10) –

+24

"xyz-file : 현재 디렉토리에서만 상대적인 심볼릭 링크를 만들 수 있습니다"라는 이유는 소스 디렉토리에서 상대 경로를 지정했기 때문입니다. "cp -sR/root/absolute/path/name dest"와 같이 소스의 절대 경로를 지정하면 원하는대로 작동합니다. – PonyEars

+3

모든 symlink를 필요로하거나 만들고 싶다면 다음과 같이 [symlinks] (http://www.linuxcommand.org/man_pages/symlinks8.html)를 사용할 수 있습니다 :'cp -sR/orig/dest && symlinks - rc/dest' –

0

나는 쉘에 관한 질문을 알고 있지만 쉘에서 펄을 호출 할 수 있기 때문에 몇 년 전 에 posted it을 작성하는 도구를 썼다. 내 경우에는 일반적으로 디렉토리를 달리 결정할 때까지 링크를 유지하기를 원했습니다. 이 작업을 자동으로 재귀 적으로 수행하는 것은 사소한 변화입니다.

7

그런 일을하는 "lndir"유틸리티 (X에서 제공)가 있습니다. 나는 그것이 여기 언급 한 것을 발견했다 : Debian Bug report #301030: can we move lndir to coreutils or debianutils?, 나는 행복하게 그것을 사용하고있다.

+2

나는 원래 질문자로서 정확한 문제를 가지고 있었고 쉘 스크립트를 코딩하기 시작한 후에이 대답을 발견하고 lndir이 이미 설치되어 있음을 발견했습니다. 내가 필요한만큼 정확하게 작동합니다. – shmuelp

13
cp -as /root/absolute/path/name dest_dir 

원하는대로 할 수 있습니다. 소스 이름은 절대 경로 여야하며 상대 경로 일 수는 없습니다. 그렇지 않으면이 오류가 발생합니다. "xyz-file : 현재 디렉토리에서만 상대적인 심볼릭 링크를 만들 수 있습니다." DEST_DIR이 이미 존재하는 경우, 당신은 같은 것을해야 할 것이다 : 당신이 여기 더러운 손을 받고 기분이 경우

cp -as /root/absolute/path/name/* dest_dir/ 
cp -as /root/absolute/path/name/.* dest_dir/ 
1

을 속임수 또한

, 당신은 복사하는 무엇이에 관한주의 자동으로 대상 폴더를 만들고 하위 폴더를 만들고 모든 파일을 재귀 적으로 심볼릭 링크합니다. 파일이 당신이 심볼릭 링크 할 및 하위 폴더가있는 폴더에서

:

  1. 는 파일 쉘을 만들 수 있습니다.SH :

#!/bin/bash

export DESTINATION=/your/destination/folder/ 
export TARGET=/your/target/folder/ 

find . -type d -print0 | xargs -0 bash -c 'for DIR in "[email protected]"; 
do 
    echo "${DESTINATION}${DIR}" 
    mkdir -p "${DESTINATION}${DIR}"   
    done' - 


find . -type f -print0 | xargs -0 bash -c 'for file in "[email protected]"; 
do 
    ln -s "${TARGET}${file}" "${DESTINATION}${file}" 
    done' - 
  1. ctrl+O
  2. 파일 ctrl+X
  3. ,369을 닫고 파일을 저장

    nano shell.sh

  4. 복사 및이 미녀를 붙여
  5. 는 스크립트 ./shell.sh

해피 해킹 실행 스크립트 실행 chmod 777 shell.sh

  • 합니다!