2011-08-23 4 views
18

다음 디렉토리 구조가 있습니다.모든 심볼릭 링크를 원본으로 바꾼다.

/symdir 
    sym1 -> ../dir1 
    sym2 -> ../dir2 
    hello.txt 

그리고 나서

/dir1 
    some 
    files 
    here 
/dir2 
    more 
    files 

symdir (sym1, sym2)의 심볼릭 링크를 원본으로 바꾸고 싶습니다. 나는.

some_awesome_bash_func symdir symdir_output 

을 만들겠습니까?
/symdir_output 
    /dir1 
    some 
    files 
    here 
    /dir2 
    more 
    files 
    hello.txt 

어떻게하면됩니까?

+0

스크립트를 readlink' – tMC

답변

9
아마

하지 않는 가장 좋은 방법,하지만 작동 :

#!/bin/bash.exe 

for link in $(find /symdir -type l) 
do 
    loc=$(dirname $link) 
    dir=$(readlink $link) 
    mv $dir $loc 
    rm $link 
done 

참고 :이 Cygwin에서에 작성되었습니다. #!을 변경해야 할 수도 있습니다.

+3

'readlink "$ link"'다음 링크를 준다 ...'readlink -e "$ link"'는 링크 체인의 최종 목표를 준다. –

+2

공백이있는 파일 이름이 있어서는 안됩니다. 그렇지 않으면'mv' 명령이 작동하지 않습니다. –

15

당신은 rsync를 쉽게이 작업을 수행 할 수 있습니다

rsync symdir/ symdir_output/ -a --copy-links -v 

(-a 수단은 기본적으로 파일에 대한 모든 세부 사항을 보존을 --copy - 링크는 실제 파일/디렉토리로 심볼릭 링크를 설정하는 -a 무시하고, -v) 자세한입니다

편집 :

죄송합니다, 내 솔루션은 당신이 질문을 정확하게하지 않습니다. 대상 이름을 사용하는 대신 심볼릭 링크의 이름을 보존합니다. symdir_output에는 dir1과 dir2 대신 sym1과 sym2가 있습니다 (sym1과 sym2는 dir1과 dir2의 실제 사본 임). 그것이 당신을 위해 여전히 작동하기를 바랍니다.

+0

최상위 수준의 링크 만 추적 할 수있는 방법이 있는지 알고 계십니까? 나는./dir1에 심볼릭 링크가 있다면, 나는 이것을 미리 갖고 싶습니다. –

+0

정확하게 내가 무엇을 필요로하는지, thx – Paladin

44

나의 아주 개인적인 트릭 : 나는 bash는 globstar 옵션을 사용 **을 사용하고

sed -i '' **/* 

참고, 사전에 활성화 할 수 있습니다 :

shopt -s globstar 
+2

무엇을합니까? 'sed'가 파일을 어떻게 복사 할 수 있을까요? –

+2

매우 흥미 롭습니다. 나는이 작품에 조금 놀랐다. (cc @LeVieuxGildas - 작동합니다 *) – Kevin

+0

@ nikana-reklawyks sed -i FILE 작업은 'TMP = $ (mktemp); 고양이 $ FILE | sed ...> $ TMP; mv $ TMP $ FILE; ' 그래서 --follow-symlinks 옵션을 사용하지 않으면 트릭을 효과적으로 수행 할 수 있습니다 :) –

8

관련 대답, 이 솔루션은 파일을 원래 위치에 유지하고 심볼릭 링크 대신 사본을 만듭니다.

#/bin/bash 

for f in $(find . -maxdepth 1 -type l) 
do 
    cp --remove-destination $(readlink -e $f) $f 
done 
+0

이 솔루션 ('cp'를 'mv'로 대체하고 '--remove-destination'을 제거함)은 내가 예상 한대로 정확하게 작동하는 유일한 솔루션입니다. 심볼릭 링크를 원본 파일로 대체하고 이전 위치를 삭제합니다. –

+0

이러한 매개 변수 확장을 큰 따옴표로 묶어야합니다. 디렉토리가'. /'이외의 것이라면'readlink -f'를 사용하십시오 : $ in f (find. -maxdepth 1 -type l) do cp --remove-destination "$ (readlink -f "$ f") "" "$ f" done'. 그리고 루프 인수를 분리하는 것은 의심 스럽습니다 ... –

+1

일반 readlink보다'readlink -e'를 사용하는 것이 좋습니다. 평범한'readlink'는 symlink가 가리키는 경로를 리턴합니다. 거기에 파일이 없더라도 말이죠. 'cp' 단계보다'readlink' 단계에서 실패하는 것이 낫습니다. –

4

TL; DR : 훨씬 더 일반적으로 훨씬 더 안정적인 답 :

find -type l -exec sh -c 'PREV=$(realpath -- "$1") && rm -- "$1" && cp -ar -- "$PREV" "$1"' resolver {} \; 

은 "rsync를 - 투 - 다른 목적지"접근 방식은 엄격하게 우수, 보통 더 나은 디자인으로 이어집니다.

@PinkFloyd의 대답은 비정상적인 파일 이름, "묻힌"심볼릭 링크 또는 심볼릭 링크 된 디렉토리에서는 작동하지 않습니다. 나는 디렉토리 - 심볼릭 링크를 해결하기를 원했기 때문에 여기에왔다. 그래서 나는 다른 사람들도 이런 이유로이 질문을 찾을 것으로 기대한다. 또한, 내 버전 cp (GNU coreutils 8.25)은 @ PinkFloyd가 디렉토리 작업에 응답 할 때 --remove-destination을 올바르게 처리하지 못합니다. 따라서이 대답은 수동 rm을 사용합니다.

또한주의 : -rf

  • 없음을. 이것은 심볼릭 링크가 디렉토리가 아니기 때문에, -r이 필요하지 않기 때문입니다. 그리고 제한된 권한을 가진 심볼릭 링크가 없다면 (왜 그렇게 원했을까요?), -f이 필요하지 않습니다.
  • realpath은 현재 컨텍스트에서 현재 시스템의 실제 위치를 찾을 수 있고 다른 것은 중요하지 않으므로이 컨텍스트에서 완벽하게 정상적으로 작동합니다. 이 경로는 디스크에 기록되지 않으므로 오류가 아닙니다.
  • resolver 문자열은 sh입니다. man sh을 참조하십시오.
  • 일부 심볼릭 링크가 --version 또는 이와 비슷한 경우를 대비하여 어디에서나 이중 대시가 필요합니다.
  • find의 사전 주문 보증 ("상위 디렉토리는 내용보다 먼저 나열되어 있습니다")으로 인해, 먼저 상위 디렉토리가 대체되고 symlinked 디렉토리 내의 모든 심볼릭 링크가 바뀝니다. 그래서 "스택 된"심볼릭 링크로 완벽하게 작동합니다.

    ls -la | awk '/-\>/{system("rm "$10); system("cp "$12" .")}' 
    

    작동 원리 :이 같은

    ls -la 출력 뭔가 :

1

내가 그것을 이런 식으로 한

lrwxr-xr-x 1 username groupname 44 10 Oct 12:17 Queue.swift -> ../../../Platform/DataStructures/Queue.swift 

열 (10)의 이름입니다 Queue.swift입니다 로컬 파일.
열 (12)은 링크 대상의 이름이다 ../../../Platform/DataStructures/Queue.swiftawk 명령의 첫번째 부분

는 awk 명령의 다음 부분은 정규식을 사용 -> 포함될 "매치 라인을 의미 '/-\>/'이다

system("rm Queue.swift")로 확장 system

먼저 system("rm "$10)를 두 번 호출.
이 원본 파일 (심볼릭 링크)을하게됩니다 삭제하세요

둘째가 모두 함께 퍼팅 system("cp ../../../Platform/DataStructures/Queue.swift .")

로 확장 system("cp "$12" .")이다, 무슨 일 먼저 우리는 심볼릭 링크를 삭제 한 후 우리는 장소에 대상 파일을 복사 (심볼릭 링크 인) 각 파일입니다.


원래 질문의 일부는 아니지만 git과 함께 사용했습니다. 당신이 너무 일을 할 일이 있다면, 다음과 같이, 당신은 나중에 git status .을 실행할 수 있으며, 형태 변화의 무리 (그리고 아무것도)를 참조한다 :`cp`,`mkdir`와`와

typechange: Queue.swift 
관련 문제