2011-12-22 7 views
6

Wow, nigdy naprawdę używane dowiązania że dużo wcześniej, ale to jest naprawdę zadziwiające:Linki symlink nie działają, gdy link jest tworzony w innym katalogu?

bash-3.2$ echo "weird" > original.txt 
bash-3.2$ mkdir originals 
bash-3.2$ mv original.txt originals/ 
bash-3.2$ cat originals/original.txt 
weird 
bash-3.2$ mkdir copies 
bash-3.2$ ln -s originals/original.txt copies/copy.txt 
bash-3.2$ cat copies/copy.txt 
cat: copies/copy.txt: No such file or directory 
bash-3.2$ ls copies/copy.txt 
copies/copy.txt 
bash-3.2$ ls -l copies/copy.txt 
lrwxr-xr-x 1 zach staff 22 Dec 22 01:23 copies/copy.txt -> originals/original.txt 
bash-3.2$ cat originals/original.txt 
weird 
bash-3.2$ cat copies/copy.txt 
cat: copies/copy.txt: No such file or directory 
bash-3.2$ cd copies/ 
bash-3.2$ cat copy.txt 
cat: copy.txt: No such file or directory 

Dlaczego nie mogę kot dowiązanie w katalogu kopii?

Jeśli zrobię dowiązanie symboliczne z wewnątrz kopii /, mogę je dobrze ułożyć. Jeśli utworzę dowiązanie symboliczne w bieżącym katalogu, będę mógł również to zrobić dobrze. Jeśli utworzę dowiązanie symboliczne w bieżącym katalogu, a następnie przeniesiemy je do kopii /, otrzymam "copies/copy.txt: No such file lub directory".

Odpowiedz

15

Jeśli utworzysz względną ścieżkę do dowiązania symbolicznego, zostanie ona zapisana jako względne dowiązanie symboliczne. Dowiązania symboliczne odnoszą się do lokalizacji, w której znajduje się łącze, a nie do lokalizacji, w której został utworzony lub otwarty.


Należy użyć bezwzględnej ścieżki lub ścieżki względem łącza.

Zmiana:

ln -s originals/original.txt copies/copy.txt 

Do:

# absolute 
ln -s /path/to/originals/original.txt copies/copy.txt 

# relative 
cd copies 
ln -s ../originals/original.txt copy.txt 
+0

Nie trzeba używać bezwzględnej ścieżki. Tak długo, jak poprzedzasz swoją ścieżkę kropką (co oznacza "bieżącą ścieżkę do katalogu"), powinieneś być dobry. – adamwong246

5

Można również użyć ścieżki względnej do osiągnięcia tego celu. jak

cd copies 
ln -s ../originals/original.txt copy.txt 

To zadziała

po otwarciu symboliczny link, który stara się znaleźć w pliku z katalogu kopii, a ponieważ nie istnieje otrzymujesz ten błąd.

Podczas korzystania ze ścieżki względnej lub bezwzględnej problem zostanie rozwiązany.

+0

Podczas pisania skryptu, który tworzy dowiązania symboliczne, czy istnieje sposób określenia, z którego katalogu powinna być tworzona ścieżka względna? – user225643

+0

Ze skryptem powinieneś wybrać absolutną ścieżkę.Miej stały katalog zawierający dowiązania symboliczne, a następnie utwórz łącza odnoszące się do dowolnego pliku w katalogu – Raghuram

+0

Wszystkie względne dowiązania symboliczne odnoszą się do katalogu, w którym znajduje się łącze. Nie ma wymogu, aby odsyłacz wskazywał na istniejący plik po utworzeniu (jak znaleźliście). Wybór relatywnego linku lub absolutu NIE powinien być dokonywany na poziomie trudności tworząc link, ale wolisz, że chcesz powiązania względnego lub bezwzględnego. Pamiętaj, że przeniesienie względnego łącza po jego utworzeniu zmienia bezwzględną ścieżkę pliku, do którego wskazuje. Zobacz tutaj w celu konwersji: http://stackoverflow.com/questions/2564634/bash-convert-absolute-path-into-relative-path-given-a- currented-directory –

1

Weź pod uwagę przykład, w którym chcesz dowiązać symbolicznie dzienniki aplikacji do innego katalogu, który może być katalogiem podłączonym do katalogu dodatkowego, którego rozmiar nie wpłynie na działanie serwera. Teraz zamontowany katalog będzie dla ciebie docelowy i powinieneś utworzyć dowiązanie symboliczne do tego katalogu dla twojego katalogu logów.

Załóżmy, że Twój katalog aplikacji to/home/ubuntu/my_app, a po uruchomieniu aplikacji wygeneruje katalog z logami w katalogu my_app. Teraz celem końcowym jest przeniesienie obciążenia dysku na zamontowany katalog i obecnie nie mamy naszego katalogu dzienników w naszym katalogu aplikacji. Więc po prostu iść do przodu i wykonaj poniższe czynności:

mkdir /path_to_mounted_directory/log 
ln -s /path_to_mounted_directory/log /home/ubuntu/my_app_log 

To będzie najpierw utworzyć katalog o nazwie dziennik w zamontowanym sekcji i będzie mapować swoje logi aplikacji do tego katalogu. Każdy plik dodany w folderze dziennika aplikacji będzie automatycznie połączony z zamontowanym katalogiem, dzięki czemu możesz odczytywać te pliki z dowolnego miejsca, z oryginalnego katalogu dzienników lub z zamontowanego folderu.

Powiązane problemy