Hogyan távolíthatom el az összes szimbolikus kapcsolatot egy speciális célponttal?

A következő paranccsal:

ls -la * 

Az összes szimbolikus linkemet felsorolhatom.

Hogyan távolíthatom el az összes szimbolikus linket, amelyek egy speciális mappához vannak kapcsolva?

Például:

A könyvtáramban usr/local/bin A következő bejegyzések vannak:

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 

Most el akarok távolítani minden hivatkozást a /usr/local/texlive/

Megjegyzések

  • Arra gondolsz, hogy eltávolítasz egy célmappához kapcsolt összes hivatkozást? Vagy helyezze át az összes megtalált szimpla linket egy adott mappába?
  • @uther: A hivatkozások eltávolítását értem.

Válasz

Kérjük, olvassa el az alternatív választ . Még ennél is lényegesebb, bár ezen a ponton nem szavazták olyan magasra.

Ezzel törölheti az összes szimbolikus linket:

find -type l -delete 

modern find verziókkal.

Régebbi keresési verzióknál ennek lehet:

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

Egy adott linkcélra korlátozva, feltéve, hogy egyik útvonal sem tartalmaz új sor karaktert:

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

vagy szépen formázott

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

A if természetesen tartalmazhat egy összetettebb feltételt is, például egy minta illesztését a grep.


Az Ön esetére szabva:

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

vagy szépen formázva:

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

Megjegyzések

  • Ez a parancs eltávolítja az összes szimpla linket? Kérjük, olvassa el a fenti szerkesztésemet.
  • @ Marco: igen, az első három sor megtenné. További szerkesztés 🙂
  • A i id végén egy -print -t is felvennék v id = “0fdc8cc887″>

parancs vizuális visszajelzéshez.

Válasz

egy modern find, amely támogatja a -lname -t:

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

kell tennie azt.

Megjegyzések

  • Ez egy nagyszerű és egyszerű megoldás. Teszteltem, és varázslatként működik. Köszönet
  • Ennek feltehetően find /usr/local/bin
  • még korszerűnek sem kell lennie, szükségszerűen. A GNU find hosszabb ideig rendelkezik -lname -val, mint amennyit én fenntartottam (2003 körül).
  • @JamesYoungman: Köszönöm! A modern find alatt valóban a GNU find -re gondoltam. 😉 usr/local/bin -et használtam, mert ez az ' s, amit az OP használt.

Válasz

A find megoldás nagyszerű.

Csak abban az esetben, ha a találata nem “t” támogat -lname, itt van egy másik mód, amely csak a shell és readlink funkciót használja.

cd /usr/local/bin for f in *; do case "$(readlink "$f")" in /usr/local/texlive/*) rm "$f" ;; esac done 

Válasz

A következővel: zsh:

rm -f /usr/local/bin(@e"{[[ $REPLY:P = /usr/local/texlive/* ]]}") 

$REPLY:P teljes mértékben feloldja a szinkronmentes útvonalat, tehát feltételezve, hogy a /usr/local/texlive önmagában is szimblink mentes , eltávolít minden olyan fájlt, amely a symlink felbontása után /usr/local/textlive alatt él, amely linkeket tartalmazna az /usr/local/texlive/foo, de a vagy /usr/./local/texlive/whatever vagy /some/other/symlink címre, amely maga a /usr/local/texlive stb.

Válasz

Lépjen a saját elérési útjára, és állítsa be az útvonal konfigurációját

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

Megjegyzések

  • Mivel ezek olyan utak, mint usr/local/bin, amelyeket grep keres, grep -E a járható út. Ellenkező esetben nem lennének egyező eredmények. A h a ls -ban szintén nem szolgál ' itt semmilyen célra! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). További információ: man ls vagy man grep

Válasz

sudo unlink /path/of/your/package

ez

megjegyzések

  • Hogyan távolítja el az összes szimbolikus linket, amely az adott út alatt található célpontokra mutat? Ne feledje, hogy a kérdés a szimbolikus linkek eltávolításáról szól egy adott könyvtárban, amely más könyvtárak célpontjaira mutat.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük