Hvordan kan jeg fjerne alle symbolske lenker med et spesielt mål?

Med kommandoen:

ls -la * 

kan jeg liste opp alle mine symbolske lenker.

Hvordan kan jeg fjerne alle symbolske lenker som er koblet til en spesiell mappe?

For eksempel:

I katalogen min usr/local/bin Jeg har følgende oppføringer:

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 

Nå vil jeg fjerne alle lenker med banen /usr/local/texlive/

Kommentarer

  • Mener du å fjerne alle symlenker som er koblet til en målmappe? Eller flytte alle funnet symlenker til en bestemt mappe?
  • @uther: Jeg mener å fjerne koblingene.

Svar

Husk å lese det alternative svaret . Det er enda mer til det punktet, selv om det ikke stemmer så høyt på dette punktet.

Du kan bruke dette til å slette alle symbolske lenker:

find -type l -delete 

med moderne find versjoner.

På eldre søkeversjoner kan det hende at det må være:

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

For å begrense til et bestemt koblingsmål, forutsatt at ingen av banene inneholder noe nytt linjetegn:

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

eller pent formatert

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

if kan selvfølgelig også inkludere en mer kompleks tilstand som å matche et mønster med grep.


Skreddersydd for saken din:

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

eller pent formatert:

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

Kommentarer

  • Fjerner denne kommandoen alle symlinker? Se min redigering ovenfor ..
  • @ Marco: ja, de tre første linjene ville. Redigere mer 🙂
  • Jeg vil også legge til en -print på slutten av

kommando for å få visuell tilbakemelding.

Svar

Med en moderne find som støtter -lname:

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

bør gjøre det.

Kommentarer

  • Det er en flott og enkel løsning. Jeg testet og det fungerer som en sjarm. Takk
  • Antagelig skulle det være find /usr/local/bin
  • Ikke engang moderne, nødvendigvis. GNU find har hatt -lname lenger enn jeg har vedlikeholdt den (siden rundt 2003).
  • @JamesYoungman: Takk! Med moderne find mente jeg virkelig GNU find. 😉 Jeg brukte usr/local/bin, fordi det ' er hva OPen brukte.

Svar

find -løsningen er god.

Bare i tilfelle du ikke finner noe støtter -lname, her er det en annen måte som bare bruker shell og 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 fullstendig banen til en symlinkfri, så forutsatt at /usr/local/texlive er symlinkfri selv , ville det fjerne alle filer som etter symlinkoppløsning lever under /usr/local/textlive som vil inneholde lenker til /usr/local/texlive/foo men også til ../texlive/bar eller til /usr/./local/texlive/whatever eller til /some/other/symlink som i seg selv er en symlink som peker i /usr/local/texlive osv.

Svar

Gå til sti din og angi selv banekonfigurasjon

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

Kommentarer

  • Siden dette er stier som usr/local/bin som grep søker etter, grep -E er veien å gå. Ellers ville det ikke være noen samsvarende resultater. Også h i ls tjener ikke ' t noe formål her! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). For mer se man ls eller man grep

Svar

sudo unlink /path/of/your/package

det er det

Kommentarer

  • Hvordan fjerner dette alle symbolske lenker som peker mot mål under den gitte banen? Merk at spørsmålet spør om hvordan du fjerner de symbolske koblingene i en bestemt katalog som peker mot mål i en annen katalog.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *