심볼릭 링크를 하드 링크로 변환


25

소프트 링크를 디렉토리의 하드 링크로 재귀 적으로 변환하고 싶습니다. 나는 이와 같은 것을 시도했다 :

for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done

…하지만 두 가지 큰 문제가 있습니다.

  • 재귀 적이 지 않은
  • 심볼릭 링크가 아닌 파일을 선택합니다

어떻게 든 위의 줄을 먹이는 것이 find -type l좋을지 모르지만 어떻게 해야할지 모르겠습니다.


1
[이 토론] [1] ( cp -aH) 도 참조하십시오 . [1] : unix.stackexchange.com/questions/94185/…
Michael Shigorin

답변:


34

이 명령은 작동해야합니다.

find -type l -exec bash -c 'ln -f "$(readlink -m "$0")" "$0"' {} \;

작동 방식 :

  • find -type l 현재 디렉토리에서 모든 링크를 찾습니다.

  • -exec bash -c '...' {} \;bash를 실행하여 실행 ...합니다.

    {}bash가으로 액세스 할 수있는 인수로 현재 처리중인 링크의 이름을 전달 합니다 $0.

  • readlink -m "$0" 심볼릭 링크 대상의 절대 경로를 반환합니다.

  • ln -f "$(readlink -m "$0")" "$0"대상에 대한 하드 링크로 -f기호 링크 $0를 겹쳐 씁니다 ( ) .

어떤 이유로 든 링크를 변환 할 수없는 경우 링크는 그대로 유지되며 ln은 오류 메시지를 인쇄합니다.


마지막 단락과 관련하여 bash및에 대한 절대 경로를 지정하는 것으로 충분하지 ln않습니까?
Daniel Beck

2
내 문제는 기본적으로 readlink 가 기본적으로 상대 경로를 반환하지만 -e스위치가이를 수정한다는 것입니다.
Dennis

OSX의 명령은 무엇입니까?
Igor Markelov

@IgorMarkelov 죄송 합니다만 OSX에 관해서는 실마리가 없습니다.
데니스

1
Mac에서는 다음 brew install coreutils과 같습니다 find * -type l -exec bash -c 'ln -f "$(greadlink -m "$0")" "$0"' {} \;.
Igor Markelov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.