모든 심볼릭 링크를 링크 된 파일로 바꾸는 쉬운 방법이 있습니까?
모든 심볼릭 링크를 링크 된 파일로 바꾸는 쉬운 방법이 있습니까?
답변:
"easy"의 일부 정의의 경우 :
#!/bin/sh
set -e
for link; do
test -h "$link" || continue
dir=$(dirname "$link")
reltarget=$(readlink "$link")
case $reltarget in
/*) abstarget=$reltarget;;
*) abstarget=$dir/$reltarget;;
esac
rm -fv "$link"
cp -afv "$abstarget" "$link" || {
# on failure, restore the symlink
rm -rfv "$link"
ln -sfv "$reltarget" "$link"
}
done
링크 이름을 인수로하여이 스크립트를 실행하십시오. 예 : find . -type l -exec /path/tos/script {} +
"$var"하려면 "${var}"쉬 / bash는 아무것도 실행이다. 나는 하나의 bashism ( [[)을 제거했으며 나머지는 POSIX sh와 호환됩니다.
cp은 동일한 디렉토리에있는 임시 파일과 mv -f해당 임시 파일을 원본 파일로 만드는 것입니다. 이렇게하면 사람들 Ctrl-C이 파일 시스템을 잡고 있거나 파일 시스템이 rm와 cp명령 사이에 채워지 는 등의 문제 를 방지 할 수 있습니다 (따라서 새로운 기능도 ln작동 하지 못하게 함 ). ls -a필요한 경우 나중에 정리할 수 있도록 임시 파일 이름을 쉽게 찾을 수 있습니다.
abstarget=$(readlink -f "$link")대신에 왜 사용하지 않았는지를 진지하게 기억하지 못하지만 이식성 이유 일 수 있습니다.
tar를 사용하여 데이터를 새 디렉토리에 복사하는 것이 더 쉬울 수 있습니다.
-H (c and r mode only) Symbolic links named on the command line will be followed; the target of the link will be archived, not the link itself.
이런 식으로 사용할 수 있습니다
tar -hcf - sourcedir | tar -xf - -C newdir
tar --help:
-H, --format=FORMAT create archive of the given format
-h, --dereference follow symlinks; archive and dump the files they point to
tar -hcf - sourcedir | tar -xf - -C newdir
cp -L더 간단한 해결책입니다
cp구현이 디렉토리를 복사 하지는 않습니다 .
"쉬운"은 아마도 당신의 기능 일 것입니다.
"find"명령 행 유틸리티를 사용하여 심볼릭 링크 된 파일을 찾은 다음 rm 및 cp를 호출하여 파일을 제거하고 교체하는 스크립트를 작성했을 것입니다. sym 링크를 이동하기 전에 충분한 여유 공간이 남아 있는지 찾기 확인으로 호출되는 작업을 수행하는 것이 좋습니다.
또 다른 해결책은 문제 링크를 숨기고있는 삼바와 같은 것을 통해 문제의 파일 시스템을 마운트 한 다음 모든 것을 복사하는 것입니다. 그러나 많은 경우에 이와 같은 것이 다른 문제를 야기 할 수 있습니다.
귀하의 질문에 대한보다 직접적인 답변은 "예"일 것입니다.
편집 : 더 구체적인 정보 요청에 따라. find 의 man 페이지에 따르면 이 명령은 모든 sym 링크 파일을 /에서 2 개 디렉토리 깊이까지 나열합니다.
find / -maxdepth 2 -type l -print
( 여기에서 발견되었습니다 )
찾을 때 무언가를 실행하려면 :
find / -maxdepth 2 -type l -exec ./ReplaceSymLink.sh {} \;
방금 작성한 스크립트를 호출하고 방금 찾은 파일 이름을 전달합니다. 또는 찾기 출력을 파일로 캡처 한 후 ( "find [blah]> symlinks.data"등 사용) 원본을 정상적으로 복사하기 위해 작성한 스크립트로 해당 파일을 전달할 수 있습니다.
-exec ./ReplaceSymLink.sh {} \;
이것은 내가 사용한 oneliner입니다. 모든 로컬 파일이 "source"의 다른 파일에 대한 링크라고 가정하십시오. 패턴 또는 "찾기"로 파일 선택을 세분화 할 수 있습니다. 사용하기 전에 이해하십시오.
f in *; cp --remove-destination source / $ f $ f; 끝난
이것이 도움이되기를 바랍니다.
find ./ -type l -print0|xargs -0 -n1 -i sh -c 'cp --remove-destination $(readlink "{}") "{}" '
MastroGeppetto의 https://superuser.com/a/1301199/499386 기반
거기에 좋은 답변이 많이 있지만 당신이 쉬운 것을 찾고 있었던 이래로
for i in *; do link=$(readlink $i) && rm $i && mv $link $i; done
for f in *; do cp --remove-destination $(readlink "$f") "$f"; done