Hvordan kan jeg fjerne alle symbolske links med et specielt mål?

Med kommandoen:

ls -la * 

kan jeg liste alle mine symbolske links.

Hvordan kan jeg fjerne alle symbolske links, der er linket til en særlig mappe?

For eksempel:

I min bibliotek usr/local/bin Jeg har følgende 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 vil jeg fjerne alle links med stien /usr/local/texlive/

Kommentarer

  • Mener du at fjerne alle symlinks, der er knyttet til en målmappe? Eller flytte alle fundne symlinks til en bestemt mappe?
  • @uther: Jeg mener at fjerne links.

Svar

Sørg for at læse det alternative svar . Det er endnu mere til det punkt, selvom det ikke stemmer så højt på dette tidspunkt.

Du kan bruge dette til at slette alle symbolske links:

find -type l -delete 

med moderne find versioner.

På ældre findversioner kan det være nødvendigt:

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

For at begrænse til et bestemt linkmål, forudsat at ingen af stierne indeholder noget nyt linjetegn:

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

eller pænt formateret

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

if kunne naturligvis også omfatte en mere kompleks tilstand såsom at matche et mønster med grep.


Skræddersyet til din sag:

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

eller pænt formateret:

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 kommando alle symlinks? Se min redigering ovenfor ..
  • @ Marco: ja, de første tre linjer ville. Redigere mere 🙂
  • Jeg vil også tilføje en -print i slutningen af

kommando for at få visuel feedback.

Svar

Med en moderne find, der understøtter -lname:

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

skal gøre det.

Kommentarer

  • Det er en fantastisk og enkel løsning. Jeg testede, og det fungerer som en charme. Tak
  • Formentlig skulle det være find /usr/local/bin
  • Ikke engang moderne, nødvendigvis. GNU find har haft -lname i længere tid, end jeg har vedligeholdt det (siden omkring 2003).
  • @JamesYoungman: Tak! Med moderne find mente jeg virkelig GNU find. 😉 Jeg brugte usr/local/bin, fordi det ' er, hvad OPen brugte.

Svar

find løsningen er fantastisk.

Bare hvis dit fund ikke gør det understøtter -lname, her er en anden måde, der kun bruger 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 stien til en symlink-fri fuldt ud, så forudsat at /usr/local/texlive er symlink-fri selv , ville det fjerne alle filer, der efter symlinkopløsning lever under /usr/local/textlive, som ville omfatte links til /usr/local/texlive/foo, men også til ../texlive/bar eller til /usr/./local/texlive/whatever eller til /some/other/symlink som i sig selv er et symlink, der peger i /usr/local/texlive osv.

Svar

Gå til sti din og indstil dig sti-konfiguration

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

Kommentarer

  • Da dette er stier som usr/local/bin som grep søger efter, grep -E er vejen at gå. Ellers ville der ikke være nogen matchende resultater. Også h i ls tjener ' ikke noget formål her! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). For mere se man ls eller man grep

Svar

sudo unlink /path/of/your/package

det er det

Kommentarer

  • Hvordan fjerner dette alle symbolske links, der peger på mål under den givne sti? Bemærk, at spørgsmålet stilles for at fjerne de symbolske links i en bestemt mappe, der peger på mål i en anden mappe.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *