Cum pot elimina toate linkurile simbolice cu o țintă specială?

Cu comanda:

ls -la * 

Pot lista toate linkurile mele simbolice.

Cum pot elimina toate linkurile simbolice care sunt legate de un folder special?

De exemplu:

În directorul meu usr/local/bin Am următoarele intrări:

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 

Acum vreau să elimin toate legăturile cu calea /usr/local/texlive/

Comentarii

  • Adică eliminați toate linkurile simbolice legate de un folder țintă? Sau mutați toate linkurile simbolice găsite într-un anumit folder?
  • @uther: mă refer la eliminarea linkurilor.

Răspuns

Vă rugăm să vă asigurați că citiți răspunsul alternativ . Este chiar mai precis, deși nu a fost votat la fel de mare în acest moment.

Puteți utiliza acest lucru pentru a șterge toate linkurile simbolice:

find -type l -delete 

cu versiuni moderne find.

În versiunile mai vechi de identificare, trebuie să fie:

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

Pentru a limita la un anumit link țintă, presupunând că niciuna dintre căi nu conține niciun caracter de linie nouă:

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

sau frumos formatat

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

if poate include, desigur, și o condiție mai complexă, cum ar fi potrivirea unui model cu grep.


Adaptat cazului dvs.:

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

sau frumos formatat:

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

Comentarii

  • Această comandă elimină toate linkurile simbolice? Vă rugăm să consultați ediția mea de mai sus ..
  • @ Marco: da, primele trei rânduri ar fi. Editarea mai mult 🙂
  • Aș adăuga și un -print la sfârșitul

comandă pentru a obține feedback vizual.

Răspuns

Cu un find modern care acceptă -lname:

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

ar trebui să facă it.

Comentarii

  • Aceasta este o soluție excelentă și simplă. Am testat și funcționează ca un farmec. Mulțumim
  • Probabil că ar trebui să fie find /usr/local/bin
  • Nici măcar modern, neapărat. GNU find are -lname de mai mult timp decât l-am întreținut (din jurul anului 2003).
  • @JamesYoungman: Mulțumiri! Prin find modern am vrut să spun GNU find. 😉 Am folosit usr/local/bin, deoarece ' este ceea ce a folosit OP.

Răspuns

Soluția find este excelentă.

Doar în cazul în care găsirea dvs. nu „t suport -lname, aici este un alt mod care folosește numai shell și readlink.

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

Răspuns

Cu zsh:

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

$REPLY:P rezolvă complet calea către una fără linkuri simbolice, deci presupunând că /usr/local/texlive este link-ul simbolic în sine , ar elimina toate fișierele care, după rezoluția link-ului simbolic, se află sub /usr/local/textlive, care ar include linkuri către /usr/local/texlive/foo, dar și către ../texlive/bar sau către /usr/./local/texlive/whatever sau către /some/other/symlink care este el însuși un link simbolic care indică în /usr/local/texlive, etc.

Răspuns

Mergeți la calea dvs. și setați-vă configurația căii

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

Comentarii

  • Deoarece acestea sunt căi precum usr/local/bin pe care le caută grep, grep -E este calea de urmat. În caz contrar, nu ar exista rezultate potrivite. De asemenea, h din ls nu servește la niciun scop aici! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Pentru mai multe consultați man ls sau man grep

Răspuns

sudo unlink /path/of/your/package

thats it

Comentarii

  • Cum elimină acest lucru toate legăturile simbolice care indică țintele aflate sub calea dată? Rețineți că întrebarea se întreabă despre eliminarea legăturilor simbolice dintr-un anumit director care indică țintele dintr-un alt director.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *