소프트 링크를 디렉토리의 하드 링크로 재귀 적으로 변환하고 싶습니다. 나는 이와 같은 것을 시도했다 :
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은 오류 메시지를 인쇄합니다.