Cara menemukan semua tautan simbolis yang menunjuk ke sembarang file / direktori di dalam direktori yang diberikan

14

Pada pertanyaan ini atau yang satu ini (misalnya) Anda akan mendapatkan solusi tentang cara mencari symlink yang menunjuk ke direktori tertentu (sebut saja /dir1), sementara saya tertarik pada tautan simbolik yang mungkin menunjuk ke file / folder di dalamnya /dir1.

Saya ingin menghapus direktori tersebut tetapi saya tidak yakin bahwa saya aman untuk melakukannya, seperti pada direktori lain (sebut saja /dir2), saya mungkin memiliki symlink yang menunjuk ke bagian dalam /dir1.

Lebih lanjut, saya mungkin telah membuat symlink ini menggunakan jalur absolut atau relatif. Satu-satunya bantuan saya adalah bahwa saya tahu symlink yang ingin saya periksa ada di sistem file yang terpasang, aktif /dir2.

Antonello
sumber

Jawaban:

15

Anda dapat menemukan semua tautan simbolik menggunakan:

find / -type l 

Anda mungkin ingin menjalankan ini sebagai root untuk sampai ke setiap tempat pada disk.

Anda dapat memperluas ini menggunakan readlink -funtuk mendapatkan path lengkap dari tautan dan Anda harus dapat grepoutput terhadap direktori target yang Anda pertimbangkan untuk dihapus:

find / -type l -exec readlink -f {} + | grep -F /dir2

Menggunakan find / -type l -printf '%l\n'tidak berfungsi saat Anda mendapatkan tautan relatif seperti ../tmp/xyzyang mungkin mengarah ke direktori target Anda, tetapi tidak cocok karena mereka tidak sepenuhnya diperluas.

Anthon
sumber
1
Dalam hal subtree dapat bermanfaat untuk mengikuti symlink:find -L /subtree -xtype l -exec readlink -f {} +
ruvim
3

Dalam kasus saya, jawaban yang diterima tidak berguna (karena tidak menampilkan sumber tautan). Inilah yang bekerja untuk saya.

Saya mengatasinya menggunakan dua -execklausa:

find /home/ -type l -exec readlink -nf {} ';' -exec echo " -> {}" ';' | grep "/dir2"
Dorian Marchal
sumber
1

Dengan zsh:

printf '%s\n' /dir2/**/*(D@e'([[ $REPLY:P = /dir1(/*|) ]])')
Stéphane Chazelas
sumber