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 GNUfind
. 😉 Jeg brukteusr/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
somgrep
søker etter,grep -E
er veien å gå. Ellers ville det ikke være noen samsvarende resultater. Ogsåh
ils
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 seman ls
ellerman 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.