elenca i file per target symlink


23

Come posso ottenere un elenco di file (e quindi fare qualcosa con quell'elenco) filtrando il nome target del link simbolico e non il nome del link simbolico? Ad esempio dal seguente elenco sono interessato solo ai primi quattro file (la destinazione contiene bar):

foo ->  /tmp/bar
bar ->  /home/me/bartoo
baz ->  /home/me/public/barthree
zoo ->  /usr/share/bar
moo ->  /tmp/foo
roc ->  /tmp/roc

Risposte:


31

Puoi usare find per recuperare tutti i file di tipo symlink e aggiungere l' -ilnameopzione per cercare per nome della destinazione del link. Funziona esattamente come -inameper il nome di destinazione del collegamento anziché per il nome del collegamento.

find -type l -ilname "*bar*"

Che stamperà comunque il nome del collegamento, non la destinazione. Se si desidera stampare i nomi delle destinazioni, provare questo:

find -type l -ilname "*bar*" -printf "%l\n"

O ottieni un lsoutput completo

find -type l -ilname "*bar*" -ls

Cosa intendi con " fai qualcosa con la lista " non è chiaro, ma se volessi operare sui file dei link, potresti usare l' -execargomento per trovare:

find -type l -ilname "*bar*" -exec touch {} \;

Ma se devi operare sui target dei link, dovrai usare i -printfper ottenere i valori target e poi xargso alcuni loop per operare. Potresti fare qualcosa del genere:

find -type l -printf "%l\n" | grep bar | xargs touch

... che dimostra anche come usare grepinvece di find -ilnamefare la corrispondenza del tuo nome, anche se potresti farlo in entrambi i modi.


grazie Caleb! Hai risposto completamente alla mia domanda immediata, oltre a coprire alcuni casi di canale laterale che userò sicuramente anche.
matt wilkie,

1
qualche idea sul perché questo non find /dev/disk/ -type l -ilname "*sde*"funziona?
Aquarius Power il

Richiede GNU find.
va il
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.