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 GNUfind
. 😉 Jeg brugteusr/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
somgrep
søger efter,grep -E
er vejen at gå. Ellers ville der ikke være nogen matchende resultater. Ogsåh
ils
tjener ' ikke noget formål her!-h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G)
. For mere seman ls
ellerman 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.