Символическое связывание в Терминале (Что я делаю не так?)

769
jsejcksn

Я хочу создать символические ссылки для всех файлов в папке parent/target/. Я хочу, чтобы ссылки были в папке parent/destination/. Мой рабочий каталог предназначен parent/для следующего вывода терминала с использованием bash:

$ cd target/
$ ll
total 16
drwxr-xr-x 4 jesse staff 136 Feb 23 16:31 ./
drwxr-xr-x@ 10 jesse staff 340 Feb 23 16:38 ../
-rw-r--r-- 1 jesse staff 10 Feb 23 16:23 file.txt
-rw-r--r-- 1 jesse staff 10 Feb 23 16:23 file2.txt
$ ln -s * ../destination/
$ ll ../destination/
total 16
drwxr-xr-x 4 jesse staff 136 Feb 23 16:38 ./
drwxr-xr-x@ 10 jesse staff 340 Feb 23 16:38 ../
lrwxr-xr-x 1 jesse staff 8 Feb 23 16:38 file.txt@ -> file.txt
lrwxr-xr-x 1 jesse staff 9 Feb 23 16:38 file2.txt@ -> file2.txt

Почему он создает символические ссылки, которые ссылаются на себя ?? Я прочитал lnсправочную страницу и другие lnвопросы, связанные с SE, но, похоже, я что-то упустил.

(Я использую Bash в терминале в OS X 10.11.3)

0
Вам необходимо указать абсолютный путь в источнике, например, `ln -s / home / jesse / target / * ../ destination /`. AFH 8 лет назад 1
@AFH Спасибо. Это сработало отлично. Почему `ln` требует абсолютного пути к цели? Существуют ли другие программы bash, которые требуют абсолютных путей? Это не то, с чем я сталкивался раньше. Также, пожалуйста, добавьте это как ответ, чтобы я мог пометить его как правильный. jsejcksn 8 лет назад 0

1 ответ на вопрос

1
AFH

Вам необходимо указать абсолютный путь в источнике: в вашем случае это будет:

ln -s $PWD/* ../destination/ 

В отличие от жесткой ссылки, где созданная запись каталога напрямую ссылается на тот же исходный файл, символическая ссылка содержит текст исходной ссылки на файл. Действительно, исходный файл не должен существовать при создании символической ссылки, хотя, очевидно, ваше использование *гарантирует, что используются только существующие исходные файлы.

На самом деле все немного сложнее: если вы указываете абсолютный путь в ссылке, то ссылка на ссылку действует так, как если бы вы указали исходный файл; но если вы укажете относительный путь, он будет добавлен в каталог, где находится ссылка. Таким образом, альтернатива, которую вы можете использовать из targetкаталога:

cd ../destination/; ln -s ../target/* . 

Это будет иметь тот же эффект, что и абсолютный путь, но имеет одно отличие: если все дерево каталогов было скопировано или перемещено в другое место (например, где-то в другом каталоге пользователя), ссылки будут ссылаться на файлы в их новом местоположении. Поэтому выбор абсолютных или относительных ссылок будет зависеть от того, захотите ли вы когда-нибудь скопировать или переместить исходные файлы вместе со ссылками: если исходные файлы всегда будут оставаться в одном месте, используйте абсолютные ссылки.

Это определенно ответило на мой вопрос и научило меня нескольким вещам. Спасибо за это. У меня есть вопрос о последнем бите ... Я проверил то, что вы предлагали об использовании относительного пути, чтобы увидеть, будут ли ссылки следовать перемещенным файлам, но они этого не сделали. Моя структура выглядит как `/a/1.txt /a/2.txt / aa / / b /`, и я запустил `cd b /; ln -s ../a/*. / `, которая создала ссылки, но затем, когда я переместил два текстовых файла в папку` aa`, ссылки больше не работали. jsejcksn 8 лет назад 0
Я не думаю, что вы поняли, что я сказал об относительных ссылках: вам нужно переместить как исходные файлы, так и ссылки как часть одной и той же структуры подкаталогов; Вы не можете двигать одно и не другое. Итак, если ваши файлы - `dir1 / a / *. Txt` и ссылки -` dir1 / b / *. Txt`, то вы можете переместить / скопировать всю структуру `dir1 /` в `dir2 /` и ссылки все равно будет работать, тогда как абсолютные ссылки будут по-прежнему ссылаться на `dir1 /`; если вы перемещаете файлы независимо от ссылок, вам нужно будет переделать ссылки - в вашем случае это `../ aa / *`. AFH 8 лет назад 0
Хорошо, это проясняет для меня. Спасибо за всю информацию. jsejcksn 8 лет назад 0