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


43

Con il comando:

ls -la *

Posso elencare tutti i miei collegamenti simbolici.

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

Per esempio:

Nella mia directory usr/local/binho 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 voglio rimuovere tutti i collegamenti con il percorso /usr/local/texlive/


1
Vuoi dire rimuovere tutti i collegamenti simbolici collegati a una cartella di destinazione? O spostare tutti i collegamenti simbolici trovati in una cartella specifica?
George M,

@uther: intendo rimuovere i collegamenti.
Marco Daniel,

Risposte:


63

Assicurati di leggere la risposta alternativa . È ancora di più al punto, sebbene a questo punto non sia stato votato più in alto.

Puoi usarlo per eliminare tutti i collegamenti simbolici:

find -type l -delete

con findversioni moderne .

Nelle versioni precedenti di ricerca potrebbe essere necessario:

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

Per limitare a un determinato target di collegamento, supponendo che nessuno dei percorsi contenga alcun carattere 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

Il ifpotrebbe naturalmente comprendere anche una condizione più complessa come l'accoppiamento 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

Questo comando rimuove tutti i collegamenti simbolici? Si prega di vedere la mia modifica sopra ..
Marco Daniel

@Marco: sì, sarebbero le prime tre righe. Modifica di più :)
0xC0000022L

Vorrei anche aggiungere un -printalla fine del findcomando per ottenere un feedback visivo.
runlevel0

30

Con un moderno findche supporta -lname:

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

dovrebbe farlo.


1
Questa è una soluzione grande e semplice. Ho provato e funziona come un fascino. Grazie
Marco Daniel,

Presumibilmente dovrebbe esserefind /usr/local/bin
James Youngman,

1
Nemmeno moderno, necessariamente. GNU findha avuto -lnameper più di quanto io abbia mantenuto (dal 2003 circa).
James Youngman,

@JamesYoungman: Grazie! Per moderno findintendevo davvero GNU find. ;) Ho usato usr/local/bin, perché è quello che ha usato l'OP.
Christoffer Hammarström,

5

La findsoluzione è fantastica

Nel caso in cui la tua ricerca non supporti -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

1

Con zsh:

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

$REPLY:Prisolve completamente il percorso verso uno privo di collegamento simbolico, quindi supponendo che /usr/local/texlivesia libero da /usr/local/textlivecollegamento simbolico, rimuoverà tutti i file che dopo la risoluzione del collegamento simbolico vivono sotto il quale includere collegamenti a /usr/local/texlive/fooma anche ../texlive/barverso /usr/./local/texlive/whatevero verso /some/other/symlinkcui è esso stesso un collegamento simbolico /usr/local/texlive, ecc. .


0

Vai al percorso e imposta la configurazione del percorso

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

Dal momento che questi sono percorsi come usr/local/binquello che grepsta cercando, grep -Eè la strada da percorrere. Altrimenti non ci sarebbero risultati corrispondenti. Anche hnel lsnon servire qualsiasi scopo qui! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Per ulteriori informazioni, vedere man lsoman grep
ss_iwe
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.