it-swarm-id.com

Bagaimana saya bisa "menautkan kembali" banyak symlink yang rusak?

Saya memiliki pohon direktori yang memiliki banyak tautan simbolik ke file di bawah /home... Namun, saya telah pindah /home hingga /mnt/home dan perlu cara untuk "menghubungkan kembali" semua symlinks. Apakah fungsi tersebut ada atau apakah saya perlu menulis skrip untuk melakukannya?

Sebagai contoh, saya memiliki sesuatu seperti berikut:

[[email protected] ~]# ls -l /mnt/home/someone/something
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/e

/mnt/home/someone/something/subdir:
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/subdir/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/subdir/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/subdir/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/subdir/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/subdir/e

Saya menginginkan sebuah perintah yang akan menemukan semua symlink dan menghubungkan kembali ke tempat yang sama tetapi di bawah /mnt/home dari pada /home

Apakah ada perintah seperti itu?

55
Josh

Tidak ada perintah untuk menargetkan ulang tautan simbolik, yang bisa Anda lakukan adalah menghapusnya dan membuat yang lain. Dengan asumsi Anda memiliki utilitas GNU (mis. Di Linux atau Cygwin yang tidak tertanam), Anda dapat menggunakan -lname utama find untuk mencocokkan tautan simbolik dengan targetnya, dan readlink untuk membaca konten tautan. Belum dicoba:

find /mnt/home/someone/something -lname '/home/someone/*' \
     -exec sh -c 'ln -snf "/mnt$(readlink "$0")" "$0"' {} \;

Akan lebih baik untuk membuat tautan simbolik ini relatif. Ada utilitas kecil yang mudah disebut symlinks (awalnya oleh Mark Lords, sekarang dikelola oleh J. Brandt Buckley), hadir di banyak distribusi Linux. Sebelum pindah, atau setelah Anda memulihkan tautan yang valid seperti di atas, jalankan symlinks -c /mnt/home/someone/something untuk mengonversi semua symlink absolut di bawah direktori yang ditentukan ke symlink relatif kecuali mereka melintasi batas sistem file.

Saya tahu ini tidak persis apa yang diminta penulis tetapi tampaknya mereka sudah memiliki jawaban mereka jadi saya menambahkan ini untuk orang lain seperti saya yang tersandung pada pertanyaan.

Berikut ini akan membantu jika solusi yang lebih fleksibel diperlukan seperti memiliki banyak tautan simbolik yang rusak yang dapat diperbaiki dengan mengganti bagian dari target tautan simbolik.

misalnya. Setelah perubahan nama pengguna, untuk mengganti nama pengguna lama dengan nama pengguna baru di target banyak tautan, setelah perpindahan sudah dilakukan. Buat skrip yang disebut ganti-simlink yang ditunjukkan di bawah:

#!/bin/bash
link=$1
# grab the target of the old link
target=$(readlink -- "$1")

# replace the first occurrence of oldusername with newusername in the target string
target=${target/oldusername/newusername}

# Test the link creation
echo ln -s -- "$target" "$link"

# If the above echo shows the correct commands are being issued, then uncomment the following lines and run the command again
#rm "$link"
#ln -s "$target" "$link"

dan menyebutnya dengan perintah berikut:

find /home/newusername/ -lname '/home/oldusername/*' -exec ~/bin/replace-simlinks {} \;

Semoga ini bisa membantu seseorang

sunting: Terima kasih Gilles untuk kickstart pada skrip ini dan tip tentang menggunakan skrip symlink untuk membuat tautan relatif.

13
Gerry

Buat /home sebagai symlink ke /mnt/home, dan semua symlink yang ada akan valid lagi.

4
Keith Thompson