Come posso rimuovere tutti i collegamenti simbolici con un target speciale?

Con il comando:

ls -la * 

posso elencare tutti i miei link simbolici.

Come posso rimuovere tutti i collegamenti simbolici che sono collegati a una cartella speciale?

Ad esempio:

Nella mia directory usr/local/bin Ho le seguenti voci:

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 

Ora desidero rimuovere tutti i collegamenti con il percorso /usr/local/texlive/

Commenti

  • Vuoi dire rimuovere tutti i link simbolici collegati a una cartella di destinazione? O spostare tutti i collegamenti simbolici trovati in una cartella specifica?
  • @uther: intendo rimuovere i collegamenti.

Risposta

Assicurati di leggere la risposta alternativa . È ancora più pertinente anche se non è stato votato così alto a questo punto.

Puoi usarlo per eliminare tutti i link simbolici:

find -type l -delete 

con le moderne versioni find.

Nelle versioni Find precedenti potrebbe essere necessario:

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

Per limitare a una determinata destinazione del collegamento, supponendo che nessuno dei percorsi contenga caratteri di nuova riga:

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

o ben formattato

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

if potrebbe ovviamente includere anche una condizione più complessa come la corrispondenza di un pattern con grep.


Su misura per il tuo caso:

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

o ben formattato:

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

Commenti

  • Questo comando rimuove tutti i collegamenti simbolici? Si prega di vedere la mia modifica sopra ..
  • @ Marco: sì, le prime tre righe lo farebbero. Modificando di più 🙂
  • Aggiungerei anche un -print alla fine del

comando per ottenere un feedback visivo.

Rispondi

Con un moderno find che supporta -lname:

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

dovrebbe funzionare it.

Commenti

  • Questa è unottima e semplice soluzione. Ho provato e funziona a meraviglia. Grazie
  • Presumibilmente dovrebbe essere find /usr/local/bin
  • Non necessariamente moderno. GNU find ha -lname da più tempo di quanto lho mantenuto (dal 2003 circa).
  • @JamesYoungman: Grazie! Con il moderno find intendevo veramente GNU find. 😉 Ho usato usr/local/bin, perché ' è ciò che ha utilizzato lOP.

Risposta

La soluzione find è ottima.

Nel caso in cui la tua ricerca non “t” supporta -lname, ecco un altro modo che utilizza solo shell e readlink.

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

Risposta

Con zsh:

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

$REPLY:P risolve completamente il percorso in uno privo di collegamento simbolico, quindi supponendo che /usr/local/texlive sia esso stesso libero da collegamento simbolico , rimuoverà tutti i file che dopo la risoluzione del collegamento simbolico risiedono in /usr/local/textlive che includerebbe link a /usr/local/texlive/foo ma anche a ../texlive/bar o a /usr/./local/texlive/whatever o a /some/other/symlink che è esso stesso un collegamento simbolico che punta a /usr/local/texlive, ecc.

Risposta

Vai al tuo percorso e imposta la configurazione del percorso

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

Commenti

  • Poiché si tratta di percorsi come usr/local/bin che grep sta cercando, grep -E è la strada da percorrere. Altrimenti non ci sarebbero risultati corrispondenti. Inoltre h in ls ' non serve a nulla qui! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Per ulteriori informazioni, vedere man ls o man grep

Risposta

sudo unlink /path/of/your/package

questo è tutto

Commenti

  • In che modo vengono rimossi tutti i collegamenti simbolici che puntano a obiettivi al di sotto del percorso specificato? Nota che la domanda chiede di rimuovere i collegamenti simbolici in una particolare directory che punta a destinazioni in unaltra directory.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *