심볼릭 링크를 하드 링크로 변환 $(readlink $f~) && rm $f~) done …하지만

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

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

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

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

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



답변

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

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은 오류 메시지를 인쇄합니다.


답변