Come posso trovare tutti i collegamenti simbolici in un albero di directory?


255

Sto cercando di trovare tutti i collegamenti simbolici all'interno di un albero di directory per il mio sito Web. So che posso usarlo findper fare questo, ma non riesco a capire come controllare ricorsivamente le directory.

Ho provato questo comando:

find /var/www/ -type l

... e più tardi ho scoperto che i contenuti in /var/wwwsono collegamenti simbolici, quindi ho cambiato il comando in:

find -L /var/www/ -type l

ci vuole un po 'di tempo per correre, tuttavia non ottengo partite.

Come ottengo questo per controllare le sottodirectory?

Risposte:


301

Questo attraverserà ricorsivamente la /path/to/folderdirectory ed elencherà solo i collegamenti simbolici:

ls -lR /path/to/folder | grep ^l

Se la tua intenzione è quella di seguire anche i collegamenti simbolici, dovresti usare il tuo findcomando ma dovresti includere l' -Lopzione; infatti la findpagina man dice:

   -L     Follow symbolic links.  When find examines or prints information
          about files, the information used shall be taken from the  prop‐
          erties  of  the file to which the link points, not from the link
          itself (unless it is a broken symbolic link or find is unable to
          examine  the file to which the link points).  Use of this option
          implies -noleaf.  If you later use the -P option,  -noleaf  will
          still  be  in  effect.   If -L is in effect and find discovers a
          symbolic link to a subdirectory during its search, the subdirec‐
          tory pointed to by the symbolic link will be searched.

          When the -L option is in effect, the -type predicate will always
          match against the type of the file that a symbolic  link  points
          to rather than the link itself (unless the symbolic link is bro‐
          ken).  Using -L causes the -lname and -ilname predicates  always
          to return false.

Quindi prova questo:

find -L /var/www/ -type l

Questo probabilmente funzionerà: ho trovato nella findpagina man questo diamante: se stai usando l' -typeopzione devi cambiarla in -xtypeopzione:

          l      symbolic link; this is never true if the -L option or the
                 -follow option is in effect, unless the symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

Poi:

find -L /var/www/ -xtype l

1
Grazie, probabilmente funzionerebbe, tuttavia ho appena notato che i contenuti di / var / www / sono già collegamenti simbolici e questo non sembra rientrare in quelle directory.
hafichuk,

4
@hafichuk vedi modifica finale nella mia risposta ( find -L /var/www/ -xtype l). Usare -xtypeinvece di -typedovrebbe fare il trucco nella tua ricerca. In bocca al lupo!
ztank1013,

3
Fare che ls -laR /path/to/folder | grep ^l, se anche voi volete processo di "nascosto" dot cartelle ...
wimvds

2
Grazie! Ma questo mostra solo il nome dei collegamenti ma non la loro posizione.
Kostanos,

8
in Mac OSX (10.9), -xtypenon è disponibile. find . -type lsembra controllare ricorsivamente.
amertkara,

227

Un comando, niente pipe

find . -type l -ls

Spiegazione: find dalla directory corrente in .poi tutti i riferimenti di -type linchiostro ed elencarli -lsdettagliatamente. Chiaro e semplice...

Espandendo questa risposta, qui ci sono un paio di findcomandi relativi al collegamento simbolico :

Trova collegamenti simbolici a un obiettivo specifico

find . -lname link_target

Si noti che link_targetè un modello che può contenere caratteri jolly.

Trova collegamenti simbolici interrotti

find -L . -type l -ls

L' -Lopzione indica finddi seguire i collegamenti simbolici, a meno che non vengano interrotti.

Trova e sostituisci collegamenti simbolici interrotti

find -L . -type l -delete -exec ln -s new_target {} \;

Altri esempi di ricerca

Altri findesempi sono disponibili qui: https://hamwaves.com/find/


7
Se stai cercando di essere più conciso, vale la pena ricordare che la maggior parte delle versioni findha -lsun'opzione. Quindi find . -type l -lsdovrebbe essere l'equivalente di quanto sopra.
Bratchley,

7
Questo migliora la risposta accettata perché ti dice anche dove si trovano i collegamenti simbolici nella struttura di directory, particolarmente importante quando si lavora con il tipo di albero complesso e profondo in quanto è probabile che abbia collegamenti simbolici.
Jesse Crossen,

2
Meglio che la domanda accettasse come una risposta migliore.
Lord_Dracon,

3
Questa risposta è molto più utile di quella accettata. Inoltre, se si desidera trovare collegamenti simbolici che puntano a file in una directory: find -lname '*/dir/*' -printf '%P -> %l\n'. Vale la pena ricordare che link_target è uno schema.
X-yuri,

1
Questo è il mio tipo di risposta. Chiaro e semplice. Grazie.
truthadjustr

11

find sembra già ricorsivamente di default:

[15:21:53 ~]$ mkdir foo
[15:22:28 ~]$ cd foo
[15:22:31 ~/foo]$ mkdir bar
[15:22:35 ~/foo]$ cd bar
[15:22:36 ~/foo/bar]$ ln -s ../foo abc
[15:22:40 ~/foo/bar]$ cd ..
[15:22:47 ~/foo]$ ln -s foo abc
[15:22:52 ~/foo]$ find ./ -type l
.//abc
.//bar/abc
[15:22:57 ~/foo]$ 

Questo è probabilmente uno di quei gotcha, tutti i file in / var / www sono collegamenti simbolici. Non findrecurse quelli di default?
Suppongo di

Sì, probabilmente per evitare il looping.
jman,

Ho aggiornato per usare la -Lbandiera per trovare senza fortuna - qualche ipotesi?
hafichuk,

Soluzione perfetta e mostra la posizione dei collegamenti. Grazie!
Kostanos,

8

Per vedere solo i collegamenti simbolici stessi, puoi usare

find -L /path/to/dir/ -xtype l 

mentre se vuoi vedere anche quali file hanno come target, aggiungi semplicemente una ls

find -L /path/to/dir/ -xtype l -exec ls -al {} \;

6

Questa è la cosa migliore che ho trovato finora: mostra i collegamenti simbolici nella directory corrente, ricorsivamente, ma senza seguirli, visualizzati con percorsi completi e altre informazioni:

find ./ -type l -print0 | xargs -0 ls -plah

le uscite si presentano così:

lrwxrwxrwx 1 apache develop 99 Dec  5 12:49 ./dir/dir2/symlink1 -> /dir3/symlinkTarget
lrwxrwxrwx 1 apache develop 81 Jan 10 14:02 ./dir1/dir2/dir4/symlink2 -> /dir5/whatever/symlink2Target
etc...

0

Quello che faccio è creare uno script nella mia directory bin che sia come un alias. Ad esempio ho uno script chiamato lsd ls -l | grep ^ d

potresti farne una lsl ls -lR | grep ^ l

Basta cambiarli + x e sei a posto.

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.