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 GNUfind
. 😉 Jag användeusr/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
somgrep
söker efter,grep -E
är vägen att gå. Annars skulle det inte finnas några matchande resultat. Ävenh
ils
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 seman ls
ellerman 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.