GNU/Linux >> Belajar Linux >  >> Linux

Konversi Symlink Absolut Ke Symlink Relatif Dengan Perintah Linux Sederhana?

Saya memiliki sub-sistem file lengkap di dalam jalur /home/user/system berisi struktur Linux standar dengan direktori /bin , /home , /root , /usr , /var , /etc ,…

Sub-sistem file ini berisi tautan simbolik, baik relatif maupun absolut. Symlink relatif baik-baik saja, mereka tetap berada di dalam sub-sistem file di bawah /home/user/system . Tetapi symlink absolut bermasalah, karena mengarah ke target di luar sub-sistem file.

Sebagai contoh, kami mengasumsikan symlink absolut sebagai berikut (terlihat di dalam sub-sistem file):

/usr/file1 -> /usr/lib/file1

Dalam keseluruhan sistem file kami memiliki tautan di /home/user/system/usr/file1 yang sekarang menunjuk ke file /usr/lib/file1 di luar sub-sistem file, alih-alih file /home/user/system/usr/lib/file1 di dalam sub-sistem file.

Saya ingin memiliki skrip sederhana, lebih disukai satu baris perintah (rsync, chroot, find, ...) yang mengubah setiap symlink absolut menjadi symlink relatif.

Dalam contoh yang diberikan, tautan relatif itu akan menjadi

/usr/file1 -> ../usr/lib/file1

Jawaban yang Diterima:

Dengan symlinks utilitas oleh Mark Lord (ditawarkan oleh banyak distribusi; jika milik Anda tidak memilikinya, buatlah dari sumber):

chroot /home/user/system symlinks -cr .

Atau, pada sistem yang memiliki readlink perintah dan -lname predikat find (peringatan:kode belum diuji):

cd /home/user/system &&
find . -lname '/*' -exec ksh -c '
  for link; do
    target=$(readlink "$link")
    link=${link#./}
    root=${link//+([!/])/..}; root=${root#/}; root=${root%..}
    rm "$link"
    ln -s "$root${target#/}" "$link"
  done
' _ {} +

Linux
  1. Kelola direktori home pengguna Linux dengan systemd-homed

  2. Cara Menghapus Akun Pengguna dengan Direktori Rumah di Linux

  3. Perintah Shutdown Linux (dengan Contoh)

  1. Bagaimana Linux Menangani Beberapa Pemisah Jalur Berturut-turut (/home////username///file)?

  2. Perintah Linux Paling Sederhana Dengan 10 Contoh

  3. Bagaimana mengubah default /tmp ke /home/user/tmp

  1. Melihat pengguna sistem di Linux

  2. Izin tulis pengguna SFTP yang di-chroot

  3. Jalankan perintah sebagai pengguna sistem Linux (shell =/bin/false)