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
-printalla 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
findha-lnameda più tempo di quanto lho mantenuto (dal 2003 circa). - @JamesYoungman: Grazie! Con il moderno
findintendevo 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/binchegrepsta cercando,grep -Eè la strada da percorrere. Altrimenti non ci sarebbero risultati corrispondenti. Inoltrehinls' 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 lsoman 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.