Не работает символьная ссылка linux

Содержание
  1. Почему не работает моя символическая ссылка?
  2. 4 ответа 4
  3. Как найти и удалить битые символические ссылки в Linux
  4. Что именно является символической ссылкой?
  5. Когда ломаются ссылки
  6. Нахождение сломанных символических ссылок
  7. Что делать с битыми символическими ссылками
  8. Как найти сломанные символические ссылки в Linux
  9. Поиск неработающих символических ссылок в Linux
  10. Способ 1. Используйте команду find, чтобы получить список всех неработающих символических ссылок.
  11. Способ 2. Используйте команду symlinks для поиска неработающих символических ссылок
  12. Почему моя символическая ссылка не работает?
  13. 4 ответа
  14. Поиск и удаление битых символьных ссылок в Linux
  15. Символьные ссылки
  16. Создание символьных ссылок
  17. Битые символьные ссылки
  18. Поиск битых символьных ссылок (команда find)
  19. Анализ битых символьных ссылок
  20. Удаление битых символьных ссылок
  21. Утилита symlinks
  22. Заключение

Почему не работает моя символическая ссылка?

Я пытаюсь лучше понять символические ссылки . и мне не очень повезло. Это мой фактический вывод оболочки с измененным именем пользователя / хостом:

Я подумал, что символическая ссылка должна работать прозрачно, в том смысле, что вы можете работать с файлом, на который он указывает, как если бы вы обращались к файлу напрямую (за исключением, конечно, случая rm где, конечно, ссылка просто удалены).

4 ответа 4

Симлинки, как правило, любят полные пути или относительно ссылки, в противном случае они часто могут искать file-1.txt локально (как ни странно).

Перейдите к proper и выполните ls -l и вы увидите, что символическая ссылка ищет actual/file-1.txt , когда он должен быть ../actual/file-1.txt .

Итак, у вас есть два варианта:

Дайте полный путь

Перейдите к папке, в которой вы хотите разместить ссылку, и ссылку оттуда

Редактировать: подсказка для сохранения ввода.

Вы можете просто сделать ln -s

Элементы в фигурных скобках подставляются и располагаются друг за другом, создавая команду

который связывает оба файла с целевым каталогом. Сохраняет некоторые основные тип ввода по мере продвижения в оболочке.

Проблема заключается в использовании относительных путей. Если вы указываете создание ссылки с полным явным путем, это работает.

$ cat Proper /file1.txt

Ваш пример создает ссылки proper которые ищут подкаталог с именем actual в текущем каталоге, а не предполагаемый родительский элемент обоих.

Символические ссылки могут быть хитрыми. По сути, символическая ссылка — это файл, который содержит имя файла / путь к другому файлу (и который помечен для специальной обработки). Если путь в файле ссылок начинается с ‘ / ‘, то он рассматривается как абсолютный путь, и все довольно просто. Если он не начинается с косой черты, он рассматривается как относительный путь — относительно каталога, в котором находится ссылка. (Это верно независимо от того, содержит ли имя косые черты.) Итак, вы создали proper/file–1.txt как ссылку на « actual/file–1.txt », и когда вы попытались получить к нему доступ, система попыталась получить доступ к proper/actual/file–1.txt . Ты должен был сказать

Кстати, вам не нужны touch команды. echo «file 1» > actual/file–1.txt достаточно для создания actual/file–1.txt .

Связанная проблема, и она может быть очевидна для многих, но поставила меня в тупик на несколько минут: если вы создаете символическую ссылку в каталоге, который сам является символической ссылкой, или есть символическая ссылка в пути текущего рабочего каталога, вы можете столкнуться с проблемами с неработающими символическими ссылками.

Используйте cd .. и ls -l несколько раз, чтобы увидеть, являются ли ваши родительские каталоги символическими ссылками.

Если вам нужно создать символическую ссылку, cd в исходный каталог Target и создайте там новые символические ссылки, чтобы относительные пути были точными.

Или, если выразиться иначе: относительный путь — от начала к цели. Если источник впоследствии является символической ссылкой, это нормально. Но вы можете столкнуться с проблемами при настройке нового источника link_name в каталоге, который сам каким-то образом является символической ссылкой.

Источник

Как найти и удалить битые символические ссылки в Linux

Символьная ссылка или «символическая ссылка» — это файл Linux, который просто указывает на другой файл. Если указанный файл будет удален, символическая ссылка останется, но не покажет, что есть проблема, пока вы не попытаетесь ее использовать. Вот несколько простых способов найти и удалить символические ссылки, которые указывают на файлы, которые были перемещены или удалены.

Символические ссылки играют очень полезную роль в системах Linux. Они могут помочь вспомнить, где находятся важные файлы в системе, упростить вам доступ к этим файлам и сэкономить вам много дискового пространства и возможных проблем, избавив вас от необходимости копировать большие файлы.

Что именно является символической ссылкой?

Обычно называемые symlink(символической ссылкой) или soft link(мягкой ссылкой), символические ссылки представляют собой очень маленькие файлы. На самом деле символическая ссылка содержит только имя любого файла, на который она указывает, обычно вместе с путем к файловой системе (относительно текущего местоположения или абсолютного значения).

Если файл с именем file1 указывает на файл с именем /apps/files/file-2020, длина file1 будет составлять 21 символ, даже если размер файла file-2020 составляет 2 терабайта. Если он указывает на ./file-2020, длина его будет всего 11 символов. Если указывает на file-2020, то только девять.

Если вы выполните команду, подобную «vi file1» (где file1 — имя символической ссылки), вы в конечном итоге отредактируете любой файл, на который указывает file1, а не содержимое самой символической ссылки. Системы Linux знают, как работать с символическими ссылками, и просто делают правильные вещи. Точно так же, если вы используете такие команды, как cat, more, head или tail, вы будете просматривать содержимое указанного файла.

Если вы удалите символическую ссылку, с другой стороны, вы удалите ссылку, а не ссылочный файл. Опять же, Linux делает то, что имеет смысл. Симлинки предназначены для упрощения использования и обмена файлами — не более того.

Когда ломаются ссылки

Когда файл, на который указывает символическая ссылка, удаляется из системы или переименовывается, символическая ссылка больше не будет работать, как предполагалось. Символическая ссылка не будет обновляться или удаляться с изменениями в файле, на который она указывает. Она продолжит указывать на указанный файл, даже после того, как этот файл был давно удален.

Если вы попытаетесь использовать символическую ссылку, которая указывает на несуществующий файл, вы получите ошибку, подобную этой:

Если вы попытаетесь получить доступ к символической ссылке, которая указывает на себя (бывает и так), вы увидите что-то вроде этого:

Если первая буква в длинном списке не привлекла вашего внимания, это означает, что файл является символической ссылкой. Разрешения rwxrwxrwx являются стандартными и не отражают разрешения для файла, на который указывает символическая ссылка.

Нахождение сломанных символических ссылок

У команды find есть опция, которая позволяет вам найти символические ссылки, которые указывают на файлы, которые больше не существуют. Эта команда перечисляет символические ссылки в текущем каталоге:

буква l указывает команде поиска искать символические ссылки.

Команда, показанная ниже, с другой стороны, ищет в текущем каталоге символические ссылки, которые указывают на файлы, которые не существуют:

Чтобы избежать ошибок, когда команда пытается просмотреть файлы или каталоги, на которые у вас нет разрешения, вы можете отправить весь вывод ошибок в /dev/null следующим образом:

Вы также можете найти неработающие символические ссылки с помощью такой команды. Она длиннее предыдущей, но делает тоже самое:

Что делать с битыми символическими ссылками

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

Часть этой команды rm <> превращается в команду «удалить файл».

Если вместо этого вы хотите связать символическую ссылку с другим файлом, вам придется удалить символическую ссылку, а затем воссоздать ее так, чтобы она указывала на новый файл. Вот пример:

Источник

Как найти сломанные символические ссылки в Linux

Главное меню » Операционная система Linux » Как найти сломанные символические ссылки в Linux

Недавно мы объяснили, как создать символическую ссылку в Linux. Символьные ссылки, символические ссылки или программные ссылки используются для создания ярлыков для других файлов в Linux. Символьные ссылки широко используются при компоновке библиотек в Linux.

Когда исходный файл, на который указывает ссылка, удаляется, ссылка становится висячей ссылкой. Хранение таких ссылок не может быть хорошей идеей.

Теперь возникает вопрос, как найти битые символические ссылки в Linux? В некоторых дистрибутивах битые ссылки отображаются разными цветами, но это не способ найти все такие битые ссылки.

Поиск неработающих символических ссылок в Linux

В этой статье мы покажем вам несколько способов поиска неработающим ссылок в Linux.

Способ 1. Используйте команду find, чтобы получить список всех неработающих символических ссылок.

Удивительная команда find также может быть использована для поиска неработающих программных ссылок. Более новые версии этой команды предоставляют специальную опцию для этой задачи.

Чтобы найти все висячие ссылки в текущем каталоге и его подкаталогах, вы можете использовать команду find следующим образом:

В ее выводе будут перечислены все битые ссылки:

Вы также можете использовать команду symlinks с именем символические ссылки для обработки висячих ссылок.

Возможно, вам придется установить команду symlinks. Это доступно в Debian. Если вы используете Ubuntu, вам нужно включить репозиторий Universe.

После установки вы можете использовать его следующим образом:

Итак, если вам нужно найти неработающие ссылки в текущем каталоге, вы можете использовать его следующим образом:

Вы что-то заметили? В нем указана только одна неработающая ссылка, в то время как команда find имеет две неработающие ссылки. Это потому, что если вы хотите выполнять рекурсивный поиск, вам нужно будет указать опцию:

Вы также можете удалить все неработающие ссылки с помощью опции -d команды symlinks.

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

В Linux может быть несколько способов выполнить задачу. Поиск сломанных символических ссылок – то же самое. Мы показали вам два пути, но могут быть и другие. Если у вас есть другая любимая команда для управления висячими ссылками, поделитесь ею с нами в разделе комментариев.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

Почему моя символическая ссылка не работает?

Я пытаюсь лучше понять символические ссылки . и не очень повезло. Это мой фактический вывод оболочки с именем пользователя /хоста изменено:

Я думал, что символическая ссылка должна работать прозрачно, в том смысле, что вы можете работать с файлом, на который он указывает, как если бы вы напрямую обращались к файлу (за исключением, конечно, в случае rm , где, конечно, ссылка просто удалена).

4 ответа

Символы, как правило, похожи на полные пути или относительно ссылки, в противном случае они могут часто искать file-1.txt локально (как ни странно).

Перейдите к proper и выполните ls -l и вы можете видеть, что symlink ищет actual/file-1.txt , когда это должно быть ../actual/file-1.txt

Итак, у вас есть два варианта:

Дайте полный путь

Перейдите в папку, в которую вы хотите установить ссылку, и ссылку от нее

Изменить : подсказка для сохранения ввода.

Вы можете просто сделать ln -s

Элементы фигурных скобок заменяются и помещаются друг за другом, создавая команду

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

Проблема заключается в использовании относительных путей. Если вы укажете свое создание ссылки с полным явным путем, оно будет работать.

$ cat own /file1.txt

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

Символьные ссылки могут быть сложными. По сути, символическая ссылка представляет собой файл, который содержит имя файла /путь для другого файла (и это помечено для специального обращения). Если имя пути в файле ссылки начинается с ‘ / ‘, тогда он рассматривается как абсолютный путь, и все довольно просто. Если он не начинается с косой черты, он рассматривается как относительный путь — относительно каталога, в котором находится ссылка. (Это верно, содержит или нет имя слэша.) Итак, вы создали proper/file–1.txt как ссылку на « actual/file–1.txt «, и когда вы пытались получить к нему доступ, система попыталась получить доступ к proper/actual/file–1.txt

Кстати, вам не нужны команды touch . echo «file 1» > actual/file–1.txt достаточно для создания actual/file–1.txt .

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

Повторно используйте cd .. и ls -l , чтобы убедиться, что ваши родительские каталоги сами символически связаны.

Если вам нужно создать символическую ссылку, cd в исходный целевой каталог и создать там новые символические ссылки, поэтому относительные пути точный.

Или иначе: относительный путь от Origin до Target. Если вначале Origin символизируется, это нормально. Но вы можете столкнуться с проблемами при создании нового Origin link_name в каталоге, который сам как-то символически связан.

Источник

Поиск и удаление битых символьных ссылок в Linux

Обновл. 14 Сен 2021 |

На этом уроке мы рассмотрим, как найти битые (т.е. неработающие) символьные ссылки, проанализировать их и удалить из Linux-системы, если это необходимо.

Символьные ссылки

Символьные ссылки (или «мягкие ссылки», «симлинки») представляют собой некое подобие ярлыков, которые могут указывать на файлы и каталоги. В окне файлового менеджера (или в консоле терминала) символьная ссылка выглядит так же, как и обычный файл или каталог. Файл или каталог, на который указывает символьная ссылка, может находиться в любом месте файловой системы.

Предположим, например, что в вашем домашнем каталоге под названием user есть символьная ссылка, указывающая на файл под названием text-file.txt, который находится где-то в другом месте файловой системы. Команды, которые вы применяете к символьной ссылке, автоматически применяются и к файлу, на который она ссылается, т.е. если вы попытаетесь использовать команду cat или less вместе с символьной ссылкой, то увидите содержимое файла text-file.txt.

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

Мы можем легко увидеть некоторые символьные ссылки, применив к корневому каталогу команду ls . На тестовой машине с Debian 11 они выделены бледно-зеленым цветом:

Мы можем рассмотреть их подробнее, добавив опцию -l (long listing):

В начале каждой строки стоит буква l (link), которая обозначает, что данный объект является символьной ссылкой. Часть после -> показывает объект, на который указывает ссылка. В нашем примере целевыми объектами являются каталоги.

В символьных ссылках не используются права доступа к файлу (иными словами, они всегда имеют форму rwxrwxrwx ). В реальности, права доступа к символьным ссылкам определяются правами доступа к тому файлу, на который указывает символьная ссылка.

Создание символьных ссылок

Прежде, чем создавать символьную ссылку, предлагаю написать небольшую программку, которую мы свяжем с нашей ссылкой.

Для этого открываем терминал (например, с помощью сочетания клавиш Ctrl+Alt+T) и создаем новый файл ravesli.cpp:

Затем открываем этот файл любым текстовым редактором, например, nano:

Добавляем следующий код:

Нажимаем Ctrl+O для сохранения изменений и Ctrl+X для выхода из редактора.

Скомпилируем нашу программу при помощи компилятора g++:

g++ ravesli.cpp -o ravesli

Теперь переместим скомпилированный файл нашей программы к другим бинарным файлам в каталог /bin:

sudo mv ravesli /bin

Осталось создать символьную ссылку и связать её с /bin/ravesli. Для этого вводим команду ln (link) вместе с параметром -s (symbolic) и целевым объектом ( /bin/ravesli) с названием ссылки ( hello ):

ln –s /bin/ravesli hello

Мы только что связали бинарный файл с символьной ссылкой.

Битые символьные ссылки

Символьная ссылка становится битой (или «висячей»), если связанный с ней файл удаляется или перемещается в другое место. Если кто-то вручную удалит файл, не зная, что на него указывают символьные ссылки, то эти символьные ссылки больше не будут работать. Они будут похожи на дорожные знаки, указывающие на город, который снесли бульдозерами.

Для наглядной демонстрации такого поведения я специально создал символьную ссылку hello в каталоге

Видно, что ссылка указывает на программу под названием ravesli в каталоге /bin. Если мы запустим символьную ссылку, то запустится связанная с ней программа:

Далее обратимся к программе напрямую:

Как и ожидалось, мы получили тот же результат. А теперь давайте удалим файл программы:

sudo rm /bin/ravesli

Цвет символьной ссылки изменился. Она выделена красным, потому что Linux знает, что ссылка — битая. При этом система продолжает отображать объект, на который указывала ссылка, чтобы мы могли заменить файл, перекомпилировать программу или сделать другие, необходимые для восстановления символьной ссылки действия.

Обратите внимание, что если мы снова попытаемся запустить символьную ссылку, то получим ошибку ссылки, а не объекта, на который указывает ссылка:

Поиск битых символьных ссылок (команда find)

В большинстве современных версий команды find есть опция -xtype , которая упрощает поиск битых символьных ссылок. Использование команды find с опцией -xtype и флагом l (link) позволит искать и возвращать битые ссылки:

Стоит отметить, что по умолчанию поиск является рекурсивным, поэтому он автоматически выполняется для всех подкаталогов.

Если мы соединим вышеприведенную команду с командой wc -l (lines), то сможем подсчитать строки, что аналогично подсчету битых символьных ссылок:

find . -xtype l | wc -l

Как вы можете видеть, у нас есть 1 битая символьная ссылка.

Анализ битых символьных ссылок

Прежде чем удалять все битые символьные ссылки, внимательно изучите результаты команды find . Подумайте, есть ли веская причина для какой-либо из найденных символьных ссылок быть битой.

Иногда проблема может заключаться в символьной ссылке, а не в целевом файле: если символьная ссылка была создана неправильно, то она может ни на что не указывать, но при этом целевой файл существует. В таком случае пересоздание символьной ссылки станет решением проблемы.

Также возможно, что явно битая символьная ссылка используется в качестве чего-то другого, например, индикатора блокировки. Или что цель присутствует только периодически, и это ожидаемое (и желаемое) поведение конкретного программного обеспечения. Возможно, целевой файл копируется с другой машины или облака, выполняет свою функцию, а затем снова удаляется, только для того, чтобы быть замененным другой программой в следующем цикле.

Битая символьная ссылка может быть признаком неудачной установки программного обеспечения. В этом случае вместо удаления символьной ссылки вам следует либо исправить её вручную, либо повторить установку. Когда вы исправите необходимые битые ссылки, то повторите команду поиска битых ссылок. Если всё сделано правильно, исправленные символьные ссылки не должны будут больше отображаться в результатах поиска.

В целях безопасности лучше проводить удаление символьных ссылок в рамках ваших собственных каталогов. Будьте крайне осторожны при выполнении этих команд от имени root или в системных каталогах.

Удаление битых символьных ссылок

Опция -exec (execute) запускает некоторую команду, которая будет выполняться на результатах поиска, полученных от команды find . Мы собираемся использовать команду rm для удаления каждой поврежденной символьной ссылки. Часть <> заменяется именем битой символьной ссылки по мере обнаружения каждой из них с помощью команды find .

Мы должны использовать точку с запятой ( ; ), чтобы завершить список команд, которые мы хотим запустить при помощи -exec . Обратная косая черта ( \ ) используется для экранирования точки с запятой, благодаря чему она будет рассматривается как часть команды find :

find . -xtype l -exec rm <> \;

Как вы можете видеть, команда была выполнена без каких-либо признаков того, что что-то произошло. Чтобы убедиться, что битые ссылки удалены, мы повторяем команду для их поиска:

Нет никаких совпадающих результатов, что означает, что битые символьные ссылки были удалены.

symlinks — это мощная утилита для управления и исправления битых символьных ссылок. Поскольку symlinks не входит в стандартную поставку большинства дистрибутивов Linux, то вам придется установить данный инструмент вручную.

Команда установки данной утилиты (в Debian 11) будет выглядеть следующим образом:

sudo aptitude install symlinks

Примечание: Если вы используете Ubuntu, то перед установкой symlinks вам нужно будет добавить репозиторий universe в список репозиториев вашей системы:

sudo add-apt-repository universe

После успешной установки symlinks вам необходимо проверить наличие битых ссылок в вашей системе. Для этого введите следующее:

Если в вашей системе присутствует битая (dangling) ссылка, вы получите вывод, который выглядит как на вышеприведенном скриншоте.

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

Если в вашей системе присутствует битая ссылка, вы получите примерно следующий результат:

dangling: /home/diego/Документы/hello -> /bin/ravesli

Чтобы быстро удалить полученную ранее битую символьную ссылку, вы можете использовать флаг -d (delete):

Чтобы удалить битые символьные ссылки в каталоге /home, введите:

symlinks -d /home

На этот раз вывод будет не только перечислять найденные битые ссылки, но также сообщать, что ссылка теперь удалена, например:

dangling: /home/diego/Документы/hello -> /bin/ravesli
deleted: /home/diego/Документы/hello -> /bin/ravesli

Чтобы произвести рекурсивный поиск и удаление битых символьных ссылок в заданном каталоге, используйте флаги -dr (d = delete, r = recursive):

Заключение

Символьные ссылки важны для Linux, поскольку они облегчают процесс определения путей и управления ими на вашем компьютере. Но если об этом не позаботиться, то битые символьные ссылки могут занять огромный кусок вашего системного хранилища, и вы даже не узнаете об этом. В таких ситуациях в игру вступают такие утилиты, как symlinks и команда find . Также старайтесь всегда уделять время просмотру списка символьных ссылок, прежде чем запускать команду для их удаления.

Поделиться в социальных сетях:

Источник

Читайте также:  Не работает выдача прав
Оцените статью