daftar file berdasarkan target symlink

23

Bagaimana cara saya mendapatkan daftar file (dan kemudian melakukan sesuatu dengan daftar itu) dengan memfilter nama target tautan simbolis , dan bukan nama symlink? Sebagai contoh dari daftar berikut ini saya hanya tertarik pada empat file pertama (target berisi bar):

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

Jawaban:

31

Anda dapat menggunakan find untuk mengambil semua file bertipe symlink dan menambahkan -ilnameopsi untuk mencari berdasarkan nama tujuan tautan. Ini berfungsi seperti -inametetapi untuk nama target tautan alih-alih nama tautan.

find -type l -ilname "*bar*"

Itu masih akan mencetak nama tautan, bukan target. Jika Anda ingin mencetak nama target, coba ini:

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

Atau dapatkan lsoutput gaya penuh

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

Apa yang Anda maksud dengan " melakukan sesuatu dengan daftar " tidak jelas, tetapi jika Anda ingin beroperasi pada file tautan, Anda dapat menggunakan -execargumen untuk menemukan:

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

Tetapi jika Anda perlu beroperasi pada target tautan, Anda harus menggunakan -printfuntuk mendapatkan nilai target dan kemudian xargsatau beberapa loop sendiri untuk beroperasi. Anda dapat melakukan sesuatu seperti ini:

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

... yang juga menunjukkan cara menggunakan grepalih-alih find -ilnamemelakukan pencocokan nama Anda, meskipun Anda juga bisa melakukannya.

Caleb
sumber
Caleb terima kasih! Anda benar-benar menjawab pertanyaan langsung saya dan juga mencakup beberapa kasus saluran samping yang saya pasti akan gunakan juga.
matt wilkie
1
tahu mengapa ini find /dev/disk/ -type l -ilname "*sde*"tidak berhasil?
Aquarius Power
Membutuhkan penemuan GNU.
ceving