GNU/Linux >> Linux Esercitazione >  >> Linux

Converti collegamento simbolico assoluto in collegamento simbolico relativo con un semplice comando Linux?

Ho un sottofilesystem completo all'interno di un percorso /home/user/system contenente la struttura standard di Linux con le directory /bin , /home , /root , /usr , /var , /etc ,...

Questo sottofilesystem contiene collegamenti simbolici, relativi o assoluti. I relativi collegamenti simbolici vanno bene, rimangono all'interno del sottofilesystem sotto /home/user/system . Ma i collegamenti simbolici assoluti sono problematici, poiché puntano a un obiettivo al di fuori del sottofilesystem.

Ad esempio, assumiamo un collegamento simbolico assoluto come segue (visto all'interno del sottofilesystem):

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

Nel filesystem generale abbiamo un collegamento a /home/user/system/usr/file1 che ora puntano a un file /usr/lib/file1 al di fuori del sottofilesystem, invece di un file /home/user/system/usr/lib/file1 dentro il sottofilesystem.

Vorrei avere uno script semplice, preferibilmente una singola riga di comando (rsync, chroot, find, ...) che converta ogni collegamento simbolico assoluto in uno relativo.

Nell'esempio fornito, quel collegamento relativo diventerebbe

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

Risposta accettata:

Con i symlinks utility di Mark Lord (offerto da molte distribuzioni; se il tuo non ce l'ha, compilalo dal sorgente):

chroot /home/user/system symlinks -cr .

In alternativa, su sistemi che hanno un readlink comando e un -lname predicato da find (attenzione:codice non testato):

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. Gestisci le home directory degli utenti Linux con systemd-homed

  2. Come eliminare gli account utente con Home Directory in Linux

  3. Comando di arresto di Linux (con esempi)

  4. Visualizzazione degli utenti del sistema in Linux

  5. Comandi Linux più semplici con 10 esempi

Elenco degli utenti in Linux spiegato con esempi

40 “lsof Command” semplice ed efficace nel sistema Linux

Converti le schede in spazi nel terminale Linux con il comando Espandi

Elimina gli utenti in Linux con il comando Userdel

Aggiunta di nuovi utenti in Linux con il comando Useradd

Controllo dell'utilizzo delle risorse del sistema con il comando Ulimit