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?
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.
Buat /home
sebagai symlink ke /mnt/home
, dan semua symlink yang ada akan valid lagi.