GNU/Linux >> Znalost Linux >  >> Linux

Převést absolutní symbolický odkaz na relativní symbolický odkaz pomocí jednoduchého příkazu Linux?

Mám kompletní podsouborový systém uvnitř cesty /home/user/system obsahující standardní strukturu Linuxu s adresáři /bin , /home , /root , /usr , /var , /etc ,…

Tento dílčí souborový systém obsahuje symbolické odkazy, buď relativní nebo absolutní. Relativní symbolické odkazy jsou v pořádku, zůstávají v podsystému souborů pod /home/user/system . Absolutní symbolické odkazy jsou však problematické, protože ukazují na cíl mimo dílčí systém souborů.

Jako příklad předpokládáme následující absolutní symbolický odkaz (viditelný uvnitř dílčího systému souborů):

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

V celkovém souborovém systému máme odkaz na /home/user/system/usr/file1 které nyní ukazují na soubor /usr/lib/file1 mimo podsystém souborů, místo souboru /home/user/system/usr/lib/file1 uvnitř dílčího systému souborů.

Chtěl bych mít jednoduchý skript, nejlépe jeden příkazový řádek (rsync, chroot, find, …), který převede každý absolutní symbolický odkaz na relativní.

V daném příkladu by se tento relativní odkaz stal

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

Přijatá odpověď:

Pomocí symlinks utilita od Marka Lorda (nabízená mnoha distribucemi; pokud ji vaše nemá, sestavte ji ze zdroje):

chroot /home/user/system symlinks -cr .

Případně na systémech, které mají readlink příkaz a -lname predikát find (varování:netestovaný kód):

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. Jak odstranit uživatelské účty pomocí domovského adresáře v systému Linux

  2. Linux Shutdown Command (s příklady)

  3. Chrootovaná uživatelská oprávnění k zápisu SFTP

  1. Spravujte domovské adresáře uživatelů Linuxu pomocí systemd-homed

  2. Jak změnit výchozí /tmp na /home/user/tmp

  3. Spusťte příkaz jako uživatel systému Linux (shell =/bin/false)

  1. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  2. Zobrazení uživatelů systému v Linuxu

  3. Nejjednodušší linuxové příkazy s 10 příklady