Come trovare ed eliminare collegamenti simbolici interrotti su Linux

Una finestra di terminale su un laptop Linux.
Fatmawati Achmad Zaenuri / Shutterstock

I collegamenti simbolici su Linux sono una caratteristica fantastica, ma possono interrompersi e non puntare verso nulla. Ecco come individuare i collegamenti simbolici interrotti, esaminarli e rimuoverli dal sistema se necessario.

Collegamenti simbolici 101

I collegamenti simbolici, chiamati anche “collegamenti virtuali” e “collegamenti simbolici”, sono una forma di collegamenti che possono puntare a file e directory. Un collegamento simbolico ha l’aspetto di un normale file o directory in una finestra del file manager. Si presenta anche come una voce in un elenco di file in una finestra di terminale. Il file o la directory a cui punta il collegamento simbolico può essere ovunque nell’albero del file system.

Ad esempio, supponiamo che tu abbia un collegamento simbolico nella tua directory home chiamato “dave-link” che punta a un file chiamato “text-file.txt” situato da qualche altra parte nell’albero del file system. I comandi utilizzati sul collegamento simbolico vengono applicati automaticamente al file a cui punta. Se provi a usare cat o less sul collegamento simbolico, vedrai effettivamente il contenuto del file “text-file.txt”.

Un’installazione Linux standard contiene molti collegamenti simbolici. Anche se non ne crei nessuno, il sistema operativo li usa. Le routine di installazione delle applicazioni utilizzano spesso collegamenti simbolici per puntare a file eseguibili. Quando il software viene aggiornato, il file binario viene sostituito con la nuova versione e tutti i collegamenti simbolici continuano a funzionare come prima, purché il nome del nuovo file sia lo stesso del vecchio.

Possiamo facilmente vedere alcuni collegamenti simbolici usando ls nella directory principale. Alcune delle voci sono visualizzate in un colore diverso: sulla nostra macchina di prova Ubuntu 20.10, sono visualizzate in azzurro.

Digitiamo quanto segue:

ls /

ls / in una finestra di terminale.

Possiamo dare uno sguardo più approfondito usando il -l opzione (elenco lungo). Digitiamo il seguente comando per esaminare tutte le voci “lib” e la singola voce “bin”:

ls -l /lib* /bin

ls -l / lib * / bin in una finestra di terminale.

All’inizio di ogni riga c’è una “l”, che indica che l’elemento è un collegamento simbolico. Il testo dopo “->” mostra a cosa punta il collegamento simbolico. Nel nostro esempio, le destinazioni sono tutte le directory.

Le autorizzazioni sono elencate come lettura, scrittura ed esecuzione per il proprietario, il gruppo e altri. Queste sono voci false predefinite. Non riflettono le autorizzazioni effettive sugli oggetti a cui puntano i collegamenti simbolici. Sono le autorizzazioni sul file o sulla directory di destinazione che hanno la precedenza e sono rispettate dal file system.

Symlink interrotti

Un collegamento simbolico si interrompe (o resta sospeso) quando il file a cui punta viene eliminato o spostato in un’altra posizione. Se la routine di disinstallazione di un’applicazione non funziona correttamente o viene interrotta prima del completamento, potresti rimanere con collegamenti simbolici interrotti.

Se qualcuno elimina manualmente un file senza sapere che i collegamenti simbolici puntano ad esso, quei collegamenti simbolici non funzioneranno più. Saranno come segnali stradali che indicano una città che è stata demolita.

Possiamo facilmente vedere questo comportamento utilizzando un collegamento simbolico chiamato “ciao” nella directory corrente. Digitiamo quanto segue, utilizzando ls per vederlo:

ls -l

Punta a un programma chiamato “htg” in una directory chiamata “bin”. Se “eseguiamo” il collegamento simbolico, esegue il programma per noi:

./hello

Ora possiamo verificare se questo è ciò che sta accadendo eseguendo direttamente il programma:

../bin/htg

Come previsto, otteniamo la stessa risposta. Eliminiamo il file di programma:

rm ../bin/htg

Ora, quando guardiamo il collegamento simbolico, vediamo che è elencato in rosso perché Linux sa che è guasto. Ci dice anche a cosa puntava, così possiamo sostituire il file, ricompilare il programma o fare tutto il necessario per riparare il collegamento simbolico.

Nota che se proviamo a eseguire il collegamento simbolico, l’errore che otteniamo fa riferimento al nome del collegamento simbolico, piuttosto che al nome del programma a cui punta il collegamento simbolico.

Digitiamo quanto segue:

./hello

ls -l in una finestra di terminale.

Trovare collegamenti simbolici interrotti

La maggior parte delle versioni moderne di find avere la xtype (tipo esteso), che semplifica la ricerca di collegamenti simbolici interrotti. Useremo il file l bandiera con xtype, per dirgli di cercare collegamenti. Utilizzando find e xtype come segue, senza nessuno degli altri type bandiere, forze xtype per restituire collegamenti interrotti:

find . -xtype l

trova -xtype l in una finestra di terminale.

L’esecuzione del comando nella nostra home directory di prova trova alcuni collegamenti simbolici non funzionanti. Nota che la ricerca è ricorsiva per impostazione predefinita, quindi cerca automaticamente tutte le sottodirectory.

Viene elencato il link simbolico “ciao” che abbiamo interrotto di proposito, come ci aspettavamo. Uno degli altri collegamenti simbolici è correlato al browser Firefox e il resto è associato agli snap.

Se instradiamo l’output attraverso wc con il -l (linee), possiamo contare le linee, che equivale a contare i collegamenti simbolici interrotti.

Digitiamo quanto segue:

find . -xtype l | wc -l

trova .  -xtype l |  wc -l in una finestra di terminale.

Siamo informati che abbiamo 24 collegamenti simbolici interrotti che non puntano a nulla.

Trova, rivedi e quindi Rimuovi

Prima di precipitarti ed eliminare tutti i collegamenti simbolici interrotti, controlla i risultati del file find comando. Verifica se c’è un motivo valido per uno qualsiasi dei collegamenti simbolici interrotti.

A volte, il collegamento simbolico potrebbe essere il problema, piuttosto che il file di destinazione. Se il collegamento simbolico è stato creato in modo errato, potrebbe non puntare a nulla, ma il vero obiettivo è presente. In questo caso, ricreare il collegamento simbolico sarebbe la soluzione.

È anche possibile che un collegamento simbolico apparentemente interrotto venga utilizzato come qualcos’altro, come un indicatore di un blocco di file o un altro indicatore go / no go. Firefox lo fa; questo è il primo collegamento simbolico nella nostra lista. Firefox non viene utilizzato sulla nostra macchina di prova, quindi è sicuro per noi eliminarlo.

È anche possibile che l’obiettivo sia presente solo periodicamente, e questo è il comportamento previsto (e desiderato) di quel particolare software. Forse il file di destinazione viene copiato da un’altra macchina o dal cloud, svolge la sua funzione e viene quindi nuovamente cancellato, solo per essere sostituito da un programma diverso nel ciclo successivo.

Il collegamento simbolico interrotto potrebbe anche essere un sintomo di un’installazione software non riuscita. In tal caso, invece di eliminare il collegamento simbolico, dovresti correggerlo manualmente o ripetere l’installazione.

Dopo aver corretto i collegamenti interrotti che è necessario mantenere, ripetere il comando per eseguire la ricerca. I collegamenti simbolici fissi dovrebbero quindi essere assenti dai risultati della ricerca.

Per motivi di sicurezza, è meglio limitare le rimozioni di collegamenti simbolici alle proprie directory. Sii estremamente cauto nell’eseguire questi comandi come root o nelle directory di sistema.

Rimozione dei collegamenti simbolici interrotti

Il -exec L’opzione (esegui) esegue i comandi sul file find risultati di ricerca. Useremo rm per eliminare ogni collegamento simbolico interrotto. Il {} stringa viene sostituita con il nome di ogni collegamento simbolico interrotto man mano che ognuno viene scoperto da find.

Dobbiamo usare un punto e virgola (;) per terminare l’elenco dei comandi desiderati -exec correre. Useremo una barra rovesciata () per “sfuggire” al punto e virgola, quindi viene considerato come parte del find comando, piuttosto che qualcosa Bash dovrebbe agire.

Digitiamo quanto segue:

find . -xtype l -exec rm {} ;

trova .  -xtype l -exec rm {} ;  in una finestra di terminale.

Siamo tornati al prompt dei comandi senza alcuna indicazione che sia successo qualcosa. Per verificare che i collegamenti interrotti siano stati rimossi, ripetiamo il comando per cercarli, come segue:

find . -xtype l

trova .  -xtype l in una finestra di terminale.

Non ci sono risultati corrispondenti, il che significa che i collegamenti simbolici interrotti sono stati rimossi.

Ricordati di rivedere prima

Ancora una volta, prenditi sempre il tempo di rivedere un elenco di collegamenti simbolici prima di eseguire il comando per eliminarli. Puoi evitare di eliminare quelli di cui non sei sicuro eseguendo il comando per eliminarli nelle directory appropriate.

Ad esempio, sopra, avremmo potuto eseguire il comando nella directory “.snap” e quindi rimuovere manualmente il collegamento simbolico solitario “hello”. Ciò avrebbe lasciato intatto il collegamento simbolico del blocco di Firefox.

Articoli correlati

Ultimi articoli