Mogę to zrobić:
$ pwd
/home/beau
$ ln -s /home/beau/foo/bar.txt /home/beau/bar.txt
$ readlink -f bar.txt
/home/beau/foo/bar.txt
Ale chciałbym móc to zrobić:
$ pwd
/home/beau
$ cd foo
$ ln -s bar.txt /home/beau/bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt
czy to możliwe? Czy mogę jakoś rozwiązać względną nazwę ścieżki i przekazać ją ln
?
ln -s $(pwd)/bar.txt ~/
lub dołącz skrypt instalacyjny.ln -s foo/bar.txt /home/beau/bar.txt
Odpowiedzi:
Jeśli utworzysz dowiązanie symboliczne do ścieżki względnej, zostanie ono zapisane jako względne dowiązanie symboliczne, a nie bezwzględne, jak pokazano w przykładzie. To na ogół dobra rzecz. Absolutne dowiązania symboliczne nie działają, gdy system plików jest montowany gdzie indziej.
Twój przykład nie działa, ponieważ jest względny do katalogu nadrzędnego dowiązania symbolicznego, a nie gdzie
ln
jest uruchamiany.Możesz to zrobić:
Lub w tym przypadku:
Ważne jest, aby zdać sobie sprawę, że pierwszy argument po
ln -s
jest przechowywany jako cel dowiązania symbolicznego. Może to być dowolny dowolny ciąg (z tym, że nie może być pusty i nie może zawierać znaku NUL), ale w momencie używania i rozwiązywania dowiązania symbolicznego ciąg ten jest rozumiany jako ścieżka względna do katalog nadrzędny dowiązania symbolicznego (gdy się nie zaczyna/
).źródło
~
będzie działać.Jeśli używasz nowszych coreutils (używam coreutils-8.22-11), masz do tego opcję:
może przechowywać dowolny tekst; jeśli później rozwiązany, względny link to -r, --relative tworzy dowiązania symboliczne względem lokalizacji łącza
Na przykład:
źródło
-r
. Używam Maca.coreutils
> = 8.16 (źródło: superuser.com/a/837935/403979 )Przepraszam, nie. Łącza symboliczne odnoszą się do lokalizacji, w której znajduje się łącze, a nie do lokalizacji, w której byłeś podczas tworzenia łącza. Istnieje kilka dobrych powodów takiego zachowania, z których większość polega na montowaniu zdalnych systemów plików.
źródło
Istnieje wygodne małe narzędzie o nazwie
symlinks
(pierwotnie Mark Lords, obecnie utrzymywane przez J. Brandta Buckleya), obecne w wielu dystrybucjach Linuksa.Aby przekonwertować wszystkie bezwzględne dowiązania symboliczne w katalogu na względne:
Niestety nie ma opcji, aby przekonwertować pojedynczy link, musisz najpierw przenieść go do własnego katalogu.
źródło
Możesz spróbować:
Ale tworzy symboliczne łącze do absolutnej nazwy ścieżki. Twoje pytanie tekstowe zawiera wzmiankę o względnej ścieżce ...
Zwykle względna nazwa ścieżki jest tym, czego chcesz i co
ln -s
ci daje. Myślę, że chcesz:źródło
Ponieważ najpopularniejsze powłoki rozszerzają ścieżki, aby utworzyć względne dowiązanie symboliczne, powinieneś zacytować „ścieżkę źródłową”.
Ponadto
-s
parametr oznacza--symbolic
.ln
domyślnie tworzy twarde linki.źródło
Jeśli jesteś pewien, że nie ma szansy na zmianę punktów montowania, możesz osiągnąć to, co próbujesz zrobić w powłoce bash:
Zakłada się, że podczas tworzenia dowiązania symbolicznego znajdujesz się w katalogu docelowym.
źródło