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 GNUfind
. 😉 Ho usatousr/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
chegrep
sta cercando,grep -E
è la strada da percorrere. Altrimenti non ci sarebbero risultati corrispondenti. Inoltreh
inls
' non serve a nulla qui!-h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G)
. Per ulteriori informazioni, vedereman ls
oman 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.