Hur kan jag ta bort alla symboliska länkar med ett särskilt mål?

Med kommandot:

ls -la * 

kan jag lista alla mina symboliska länkar.

Hur kan jag ta bort alla symboliska länkar som är länkade till en speciell mapp?

Till exempel:

I min katalog usr/local/bin Jag har följande poster:

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 

Nu vill jag ta bort alla länkar med sökvägen /usr/local/texlive/

Kommentarer

  • Menar du ta bort alla symlänkar som är länkade till en målmapp? Eller flytta alla hittade symlänkar till en specifik mapp?
  • @uther: Jag menar att ta bort länkarna.

Svar

Var noga med att läsa det alternativa svaret . Det är ännu mer till punkten men röstades inte lika högt vid denna tidpunkt.

Du kan använda detta för att radera alla symboliska länkar:

find -type l -delete 

med moderna find versioner.

På äldre sökversioner kan det behöva vara:

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

För att begränsa till ett visst länkmål, förutsatt att ingen av sökvägarna innehåller något nylinjetecken:

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

eller snyggt formaterad

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

if kan naturligtvis också innehålla ett mer komplext tillstånd, såsom att matcha ett mönster med grep.


Skräddarsydd för ditt fall:

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

eller snyggt formaterad:

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

Kommentarer

  • Tar detta kommando bort alla symlänkar? Se min redigering ovan ..
  • @ Marco: ja, de första tre raderna skulle. Redigera mer 🙂
  • Jag skulle också lägga till en -print i slutet av

kommando för att få visuell feedback.

Svar

Med en modern find som stöder -lname:

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

borde göra det.

Kommentarer

  • Det är en bra och enkel lösning. Jag testade och det fungerar som en charm. Tack
  • Förmodligen borde det vara find /usr/local/bin
  • Inte ens modernt, nödvändigtvis. GNU find har haft -lname längre än jag har underhållit det (sedan omkring 2003).
  • @JamesYoungman: Tack! Med modern find menade jag verkligen GNU find. 😉 Jag använde usr/local/bin, för att ' är vad OP använde.

Svar

find -lösningen är bra.

Bara om din sökning inte gör det stödja -lname, här är ett annat sätt som endast använder skal och readlink.

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

Svar

Med zsh:

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

$REPLY:P löser helt sökvägen till en symlinkfri, så förutsatt att /usr/local/texlive är symlinkfritt själv , skulle det ta bort alla filer som efter symlinkupplösning lever under /usr/local/textlive som skulle innehålla länkar till /usr/local/texlive/foo men också till ../texlive/bar eller till /usr/./local/texlive/whatever eller till /some/other/symlink som i sig är en symlänk som pekar i /usr/local/texlive osv.

Svar

Gå till sökvägen din och ange själv konfiguration av sökväg

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

Kommentarer

  • Eftersom det här är sökvägar som usr/local/bin som grep söker efter, grep -E är vägen att gå. Annars skulle det inte finnas några matchande resultat. Även h i ls tjänar inte ' inget syfte här! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). För mer se man ls eller man grep

Svar

sudo unlink /path/of/your/package

det är det

Kommentarer

  • Hur tar man bort alla symboliska länkar som pekar mot mål under den angivna sökvägen? Observera att frågan ställer sig om att ta bort de symboliska länkarna i en viss katalog som pekar på mål i någon annan katalog.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *