Come trovare tutti i collegamenti software (collegamenti simbolici) nella directory corrente?


10

La domanda riguarda la shell-scripting in bash.

Come verificare con uno script quali file all'interno della directory corrente sono collegamenti software?

Nel caso in cui abbia usato il termine sbagliato, quando dico soft link , mi riferisco ai file creati usando ln -s.

L'unica cosa a cui sono riuscito a pensare è valutare ls -lacome espressione e analizzarne i risultati, ma ovviamente questa non è la soluzione migliore.


1
Sono denominati "collegamenti simbolici" (in contrapposizione ai "collegamenti fissi").
In pausa fino a ulteriore avviso.

Righto, sapevo di aver probabilmente sbagliato il termine, grazie per il testa a testa
bguiz,

Anche il collegamento soft va bene, ma con uno spazio. :-) ( en.wikipedia.org/wiki/Symbolic_link )
Arjan

Risposte:



14

Potresti non aver davvero bisogno di una sceneggiatura. Per mostrare i collegamenti simbolici solo nella cartella corrente, senza ricorrere in alcuna cartella figlio:

trova . -maxdepth 1 -type l -print

Oppure, per ottenere ulteriori informazioni, utilizzare uno di:

trova . -maxdepth 1 -type l -exec ls -ld {} +
trova . -maxdepth 1 -type l -print0 | xargs -0 ls -ld

Per dire se un file è un collegamento simbolico, si può usare readlink, che non produrrà nulla se non è un collegamento simbolico. L'esempio seguente non è abbastanza utile, ma mostra come readlinkignora i file e le cartelle normali. Usa uno di:

trova . -maxdepth 1 -exec readlink {} +
trova . -maxdepth 1 -print0 | xargs -0 readlink

Si noti che quanto sopra -exec ... +e xargs ...sono molto più veloci di -exec ... \;. Piace:

time find / usr / bin -maxdepth 1 -type l -exec ls -ld {} \;
0m0.372s reali
utente 0m0.087s
sys 0m0.163s

time find / usr / bin -maxdepth 1 -type l -exec ls -ld {} +
0m0,013s reali
utente 0m0.004s
sys 0m0.008s

time find / usr / bin -maxdepth 1 -type l -print0 | xargs -0 ls -ld
0m0,012 secondi reali
utente 0m0.004s
sys 0m0.009s

Mi è piaciuta la risposta di Polsy meglio, ancora +1 per te, dato che un giorno potrei aver bisogno di farlo fuori da uno script di shell.
bguiz,

1
Non hai necessariamente bisogno di xargs. Potresti semplicemente usare trova. -maxdepth 1 -exec readlink {} \;
Stib

Vero, @stib, ma xargsè molto più veloce sul mio Mac; vedi la mia modifica. Ma ho imparato qualcosa di nuovo oggi: c'è anche +, invece di \;(Anche se alcuni sostengono che questo ha / ha avuto problemi con grep.)
Arjan
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.