it-swarm-eu.dev

Vytvořte symbolický odkaz na relativní cestu

Dokážu to:

$ pwd
/home/beau
$ ln -s /home/beau/foo/bar.txt /home/beau/bar.txt
$ readlink -f bar.txt
/home/beau/foo/bar.txt

Ale rád bych to dokázal:

$ pwd
/home/beau
$ cd foo
$ ln -s bar.txt /home/beau/bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

Je to možné? Mohu nějak vyřešit relativní cestu a předat ji ln?

65
Humphrey Bogart

Pokud vytvoříte symbolický odkaz na relativní cestu, uloží jej jako relativní symbolický odkaz, nikoli absolutní, jak ukazuje váš příklad. To je obecně dobrá věc. Absolutní symbolické odkazy nefungují, pokud je souborový systém připojen jinde.

Důvod, proč váš příklad nefunguje, je ten, že je relativní k nadřazenému adresáři symbolického odkazu a ne kde je spuštěn ln.

Můžete dělat:

$ pwd
/home/beau
$ ln -s foo/bar.txt bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

Nebo v tomto ohledu:

$ cd foo
$ ln -s foo/bar.txt ../bar.txt

Je důležité si uvědomit, že první argument po ln -s je uložen jako cíl symbolu. Může to být libovolný řetězec (s jedinými omezeními, že nemůže být prázdný a nemůže obsahovat znak NUL), ale v době, kdy se používá a řeší symbolický odkaz, je tento řetězec chápán jako relativní cesta k nadřazený adresář symbolu (pokud nezačíná řetězcem /).

66
penguin359

Pokud používáte novější coreutils (používám coreutils-8.22-11), má možnost to udělat:

ln --help | grep relative

umí držet libovolný text; pokud je později vyřešen, relativní odkaz je -r, --relative vytvoří symbolické odkazy vzhledem k umístění odkazu

Například:

$ mkdir /tmp/test
$ touch /tmp/test/to
$ ln -rs /tmp/test/to /tmp/test/from
$ ls -l /tmp/test/from
    lrwxrwxrwx 1 ptr ptr 4 aug   25 17.02 /tmp/test/to -> from
25
ptr

Promiň ne. Symbolické odkazy jsou relativní k místu, ve kterém je odkaz, nikoli k místu, kde jste byli, když jste odkaz vytvořili. Pro toto chování existuje několik dobrých důvodů, z nichž většina zahrnuje připojení vzdálených souborových systémů.

12
Shadur

V mnoha distribucích Linuxu je přítomen pohodlný malý nástroj s názvem symlinks (původně Mark Lords, nyní spravovaný J. Brandtem Buckley).

Chcete-li převést všechny absolutní symbolické odkazy v adresáři na relativní:

symlinks -c /path/to/directory

Bohužel neexistuje žádná možnost převést jeden odkaz, musíte jej nejprve přesunout do vlastního adresáře.

mkdir ../tmp
mv link-to-relativize ../tmp
symlinks ../tmp
mv ../tmp/* .
rmdir ../tmp

Můžete zkusit:

ln -s `pwd`/bar.txt /home/beau/bar.txt

Je to však symbolický odkaz na absolutní cestu. Ve vaší textové otázce se uvádí relativní cesta ...

Normálně je relativní název cesty to, co chcete a co ln -s dává ti. Myslím, že to, co chcete, je:

cd /home/beau
ln -s foo/bar.txt bar.txt
3
MattBianco

Vzhledem k tomu, že nejběžnější skořápky rozšiřují cesty, měli byste vytvořit relativní symbolický odkaz jako „zdrojovou cestu“.

Parametr -s Také znamená --symbolic. ln ve výchozím nastavení vytváří pevné odkazy.

$ ln -s '../../relative_path' path
$ ls -al path

lrwxrwxrwx 1 empjustine empjustine 19 Aug  6 01:38 path -> ../../relative/path
1
emp.justine

Pokud jste si jisti, že se vaše připojovací body nemění, můžete dosáhnout toho, co se snažíte udělat v bash Shell, jako je tento:

ln -s `pwd`/bar.txt ~/bar.txt

To předpokládá, že jste při vytváření symbolického odkazu v cílovém adresáři.

0
mreff555