특수 대상이있는 모든 심볼릭 링크를 제거하려면 어떻게해야합니까?


43

다음 명령으로

ls -la *

모든 심볼릭 링크를 나열 할 수 있습니다.

특수 폴더에 연결된 모든 심볼릭 링크를 제거하려면 어떻게해야합니까?

예를 들면 다음과 같습니다.

내 디렉토리 usr/local/bin에는 다음과 같은 항목이 있습니다.

lrwxrwxrwx 1 root root 50 Apr 22 14:52 allneeded -> /usr/local/texlive/2011/bin/x86_64-linux/allneeded
lrwxrwxrwx 1 root root 47 Apr 22 14:52 amstex -> /usr/local/texlive/2011/bin/x86_64-linux/amstex
lrwxrwxrwx 1 root root 24 Apr 23 19:09 arara -> /home/marco/.arara/arara

이제 경로가있는 모든 링크를 제거하고 싶습니다. /usr/local/texlive/


1
대상 폴더에 연결된 모든 심볼릭 링크를 제거 하시겠습니까? 아니면 찾은 모든 심볼릭 링크를 특정 폴더로 옮기시겠습니까?
George M

@ uther : 나는 링크를 제거하는 것을 의미합니다.
Marco Daniel

답변:


63

대체 답변 을 읽으 십시오 . 이 시점에서 최고로 투표하지는 않았지만 훨씬 더 중요합니다.

이를 사용하여 모든 심볼릭 링크를 삭제할 수 있습니다.

find -type l -delete

최신 find버전으로.

이전 버전의 찾기 버전에서는 다음과 같아야합니다.

find -type l -exec rm {} \;
# or
find -type l -exec unlink {} \;

줄 바꿈 문자가 포함 된 경로가 없다고 가정하고 특정 링크 대상으로 제한하려면 다음을 수행하십시오.

 find -type l | while IFS= read -r lnkname; do if [ "$(readlink '$lnkname')" == "/your/exact/path" ]; then rm -- "$lnkname"; fi; done

또는 좋은 형식

 find -type l |
 while IFS= read -r lnkname;
 do
   if [ "$(readlink '$lnkname')" = "/your/exact/path" ];
   then
     rm -- "$lnkname"
   fi
 done

if물론 또한과 패턴 매칭 등의보다 복잡한 조건을 포함 할 수있다 grep.


귀하의 경우에 적합 :

find -type l | while IFS= read -r lnk; do if (readlink "$lnk" | grep -q '^/usr/local/texlive/'); then rm "$lnk"; fi; done

또는 좋은 형식 :

find -type l | while IFS= read -r lnk
do
  if readlink "$lnk" | grep -q '^/usr/local/texlive/'
  then
    rm "$lnk"
  fi
done

이 명령은 모든 심볼릭 링크를 제거합니까? 위의 편집 내용을 참조하십시오 ..
Marco Daniel

@Marco : 네, 처음 세 줄은 그렇습니다. 더 편집 :)
0xC0000022L 13:25에

또한 명령 -print끝에 find시각적 피드백을 얻기 위해를 추가합니다 .
runlevel0

30

현대 find를 지원합니다 -lname:

find /usr/local/bin -lname '/usr/local/texlive/*' -delete

해야합니다.


1
그것은 위대하고 간단한 해결책입니다. 나는 테스트했고 그것은 매력처럼 작동합니다. 감사합니다
Marco Daniel

아마도 그럴 것입니다find /usr/local/bin
James Youngman

1
반드시 현대적인 것은 아닙니다. GNU find-lname2003 년 이래로 내가 유지 했던 것보다 오랫동안 가지고있었습니다 .
James Youngman

@JamesYoungman : 감사합니다! 현대에 find나는 정말로 GNU를 의미했다 find. ;) usr/local/binOP를 사용했기 때문에을 사용했습니다.
Christoffer Hammarström

5

find솔루션은 중대하다.

find가 지원하지 않는 경우 -lname를 위해 shell과을 사용하는 다른 방법이 readlink있습니다.

cd /usr/local/bin
for f in *; do
  case "$(readlink "$f")" in /usr/local/texlive/*)
    rm "$f"
    ;;
  esac
done

1

zsh:

rm -f /usr/local/bin(@e'{[[ $REPLY:P = /usr/local/texlive/* ]]}')

$REPLY:P완전히 그래서 가정, 심볼릭 링크가없는 하나의 경로를 해결하는 것은 /usr/local/texlive, 그것은 심볼릭 링크 해상도 라이브에서 후 모든 파일을 제거하는 것 자체를 무료로 심볼릭 링크 /usr/local/textlive에 대한 링크가 포함됩니다 /usr/local/texlive/foo뿐만 아니라에 ../texlive/bar나에게 /usr/./local/texlive/whatever나에 대한 /some/other/symlink자체 가리키는 심볼릭 링크 인 /usr/local/texlive등 .


0

경로로 이동하여 경로 구성을 설정하십시오.

ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk '{print $9}'|xargs rm -rf

이 같은 경로이기 때문에 usr/local/bingrep를 검색, grep -E길을 가야하는 것입니다. 그렇지 않으면 일치하는 결과가 없습니다. 또한 h에서 ls여기에 어떤 목적을 제공하지 않습니다! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). 자세한 내용은 man ls또는man grep
ss_iwe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.