Как копировать ссылку и файл?
Как из командной строки скопировать символическую ссылку и файл на который она указывает?
Jaberwock ★★★
08.10.10 11:17:56 MSD
cp -L /tmp/symlink /foo/file cp -P /tmp/symlink /foo/symlink
edigaryev ★★★★★
( 08.10.10 11:34:21 MSD )
Led ★★★☆☆
( 08.10.10 11:40:07 MSD )
Ответ на: комментарий от edigaryev 08.10.10 11:34:21 MSD
Забыл сказать я знаю только имя ссылки.
Jaberwock ★★★
( 08.10.10 12:30:51 MSD ) автор топика
Ответ на: комментарий от edigaryev 08.10.10 11:34:21 MSD
Как узнать на какой файл ссылается символическая ссылка?
Jaberwock ★★★
( 08.10.10 12:33:04 MSD ) автор топика
Ответ на: комментарий от Jaberwock 08.10.10 12:33:04 MSD
Eddy_Em ☆☆☆☆☆
( 08.10.10 12:38:03 MSD )
Ответ на: комментарий от Eddy_Em 08.10.10 12:38:03 MSD
Так, или можно проще?
echo `echo $i|grep -o «\/.*\/»«ls -l $i |grep -o «[^ ]*$»`
Jaberwock ★★★
( 08.10.10 13:07:11 MSD ) автор топика
Ответ на: комментарий от Jaberwock 08.10.10 12:33:04 MSD
>Как узнать на какой файл ссылается символическая ссылка?
edigaryev ★★★★★
( 08.10.10 13:25:45 MSD )
Ответ на: комментарий от Jaberwock 08.10.10 12:30:51 MSD
>Забыл сказать я знаю только имя ссылки.
В моем примере имя самого файла знать не нужно.
Как скопировать файлы с помощью команды ср в Linux
Команда cp используется для копирования файлов, с использованием командной строки Linux.
Скопировать файл из одной директории в другую, в Linux
Команда выглядит следующим образом:
cp /источник/путь/файл /цель/путь/файл
Допустим у нас следующая структура папок
dir1 file01
Если мы хотим скопировать file01 из текущего местоположения в /home/user/dir1 в /home/user/dir2 , то мы должны выполнить следующую команду в командной строке:
cp /home/user/dir1/file01 /home/user/dir2/file01
Можно укоротить команду заменив /home/user на ~ (тильда)
Команда будет выглядеть следующим образом:
cp ~/dir1/file01 ~/dir2/file01
Можно также опустить имя файла при копировании если мы его не собираемся переименовывать:
cp ~/dir1/file01 ~/dir2
Если мы находимся в целевой папке (в папке куда нужно скопировать файл), то команда сокращается до безобразия:
cp ~/dir1/file01
То есть достаточно указать откуда, а куда — это папка в которой мы находимся сейчас.
Если мы находимся в папке с копируемым файлом, то команда может приобрести следующий вид:
cp file01 ~/dir2
Делаем резервную копию файла перед его копированием в Linux
Выше мы рассмотрели пример в котором не было копируемого файла в директории приёмнике.
А что если в dir2 есть файл с таким же именем — file01 и мы выполняем команду копирования?
cp file01 ~/dir2
Эта команда перезапишет файл file01 в целевой директории dir2 . Не будет предупреждений, подсказок, сообщения об ошибке, просто перезапишется файл, т.к. команда действительная и без синтаксических ошибок.у.
Для того, чтобы обезопасить себя от перезаписи файла в целевой папке, выполняем команду в следующем виде:
cp -b file01 ~/dir2
Ну, или же с полными путями
cp -b /home/user/dir1/file01 /home/user/dir2/file01
После выполнения этой команды в целевой папке будет скопированный файл file01 и файл с тильдой в конце file01~ , который является резервной копией.
Можно изменить команду копирования таким образом, чтобы архивные копии нумеровались, чтобы было подобие контроля версий.
cp --backup=numbered /home/user/dir1/file01 /home/user/dir2/file01
Имя файла резервных копий будет меняться: file01.~1~ , file01.~2~ и т.д.
Копирование файла с запросом перезаписи, в Linux
Если мы не хотим делать резервные копии, но хотим убедиться, что не перезапишем файл который находится в целевой папке, то выполним следующую команду:
cp -i /home/user/dir1/file01 /home/user/dir2/file01
Сообщение будет выглядеть следующим образом: cp: overwrite ‘./file1’?
Для перезаписи файла жмём Y , для отмены — N или CTRL+C .
Что происходит при копировании символьных ссылок в Linux
Символическая ссылка похожа на ярлык в Windows. Символическая ссылка содержит только адрес к файлу.
Допустим у нас следующая структура папок:
dir1 file01
dir2 file01(символическая ссылка на dir1/file01)
dir3 No Items
Что делает эта команда:
cp /home/user/dir1/file01 /home/user/dir3/file01
Она просто копирует файл (именно файл) из одной папки в другую.
А что произойдёт если скопировать символическую ссылку из dir2 (в dir2 , как мы помним, лежит файл с символической ссылкой) в dir3 ?
cp /home/user/dir2/file01 /home/user/dir3/file01
Мы скопируем в dir3 не ссылку, а сам файл!
На самом деле будет скопирован файл на который указывает символическая ссылка. Это как будто мы копируем file01 из dir1 .
Такой же результат получим с помощью следующей команды:
cp -H /home/user/dir2/file01 /home/user/dir3/file01
Используя ключ -H мы указываем команде cp следовать по символической ссылке к источнику (файлу).
Можно использовать ещё один ключ -L , который указывает на то, что всегда копировать файл, а не символическую ссылку:
cp -L /home/user/dir2/file01 /home/user/dir3/file01
Для того, чтобы скопировать символическую ссылку как символическую ссылку, а не как файл на который она указывает, необходимо указать следующую команду:
cp -d /home/user/dir2/file01 /home/user/dir3/file01
Также для копирования символической ссылки как ссылки, а не как файл на который она указывает, можно использовать следующую команду:
cp -P /home/user/dir2/file01 /home/user/dir3/file01
Создаём жесткие ссылки с помощью команды ср
В чем разница между символической ссылкой и жесткой ссылкой?
Символическая ссылка — это ярлык указывающий на файл. Ярлык не содержит сам файл, в нём только адрес который указывает на файл.
Жесткая ссылка, это ещё одно имя файла. Жёсткая ссылка может находиться там же, где и файл (только должно быть другое имя) или в другой директории. Это, по сути, сам файл, но без копирования его. То есть мы можем иметь множество жёстких ссылок на один файл, которые находятся в разных местах, но без физического копирования содержимого файла.
По сути, имя файла, когда он у нас появился в системе и есть первая жёсткая ссылка.
И ещё один момент.
Файл не удалится пока не будет удалена последняя жёсткая ссылка на него, даже если сначала удалим его первое имя, то есть удалим в том месте куда он попал впервые.
Мы отвлеклись от команды cp . Возвращаемся к ней.
Создадим жесткую ссылку с помощью команды ср.
cp -l /источник/файл /цель/файл
Например у нас есть текстовый файл с Войной и миром, Льва Толстого — voina_i_mir.txt и нам надо, чтобы мы его могли найти в системе как война_и_мир.txt
Можно его просто скопировать и переименовать, но тогда мы займём в два раза больше места.
Создав символическую ссылку мы не обезопасим себя от удаления файла-источника.
Создав жёсткую ссылку мы не копируя сам файл делаем, как бы его копию.
cp -l /home/user/voina_i_mir.txt /home/user/война_и_мир.txt
Создаём символическую ссылку с помощью команды ср
Если мы хотим создать символическую ссылку вместо жёсткой, то используем следующую команду:
cp -s /источник/файл /цель/файл
Это как альтернатива, но лучше использовать команду ln -s , она предпочтительнее cp .
Копируем файл, если он новее файла-назначения
Если мы хотим скопировать файл-источник, но только если он новее файла-назначения с перезаписью последнего, то используем следующую команду:
cp -u /источник/файл /цель/файл
Если в папке назначения нет такого файла, то будет просто операция копирования.
Как скопировать несколько файлов
Вы можете предоставить более одного исходного файла внутри команды копирования следующим образом:
cp /источник/файл1 /источник/файл2 /источник/файл3 /цель
Приведенная выше команда скопирует файл1 , файл2 и файл3 в папку цель .
Можно использовать шаблоны для массового копирования файлов.
cp /home/user/video1/*.mpv /home/user/video2
Приведенная выше команда будет копировать все файлы с расширением .mp4 в папку video2 .
Копирование папок командой cp
Папки копируются так же, как копируются файлы.
Например мы имеем следующую структуру папок:
dir1 file01 file02
И мы хотим переместить папку dir1 в папку dir2 следующим образом:
dir1 file01 file02
Для этого будем использовать следующую команду:
cp -r /home/user/dir1 /home/user/dir2
Или можно использовать следующую команду:
cp -R /home/user/dir1 /home/user/dir2
Эти команды копируют содержимое dir1 в папку dir2 , а также всё, что находится внутри папки dir1 (и папки, и файлы). Это рекурсивное копирование.
Резюме
В статье я рассмотрел основные команды и ключи для копирования файлов и папок, а также для создания символических и жёстких ссылок.
Символические и жесткие ссылки в Linux. Команда ln
Что такое символические и жесткие ссылки в Linux. Чем они отличаются. Как создавать ссылки. Использование команды ln.
Оглавление
- Что такое ссылка на файл в Linux
- Что такое символические ссылки
- Что такое жесткие ссылки
- Отличия символических ссылок от жестких
Что такое ссылка на файл в Linux
Ссылка на файл в Linux — это указатель на файл. Если проводить аналогию с Windows, то ссылки чем-то похожи на ярлыки. То есть вы создаете ссылку, которая указывает на какой-либо файл или директорию, и можете разместить эту ссылку в другом каталоге. Обращаясь к такой ссылке, вы будете обращаться к настоящему файлу или каталогу.
Ссылки в Linux бывают двух типов: символические и жесткие. Не смотря на то, что оба типа называются ссылками, они имеют существенные отличия друг от друга. Поэтому очень важно понимать, как создавать и использовать тот или иной тип ссылок.
Что такое символические ссылки
Символическая ссылка (symbolic link) — это специальный файл, который является ссылкой на другой файл или каталог (их еще называют целевым файлом, целевым каталогом).
Символические ссылки также называют символьными, мягкими ссылками (soft links) или сим-ссылками (sym-link).
Важно понимать, что символическая ссылка не содержит в себе внутри копии самого файла, на которую она указывает. Она является всего лишь указателем на файл. Не смотря на это, символическая ссылка обладает собственными правами доступа, так как сама является небольшим файлом, который содержит путь до целевого файла.
Возвращаясь к аналогии с ярлыками в Windows, символические ссылки это своего рода ярлыки на файлы. Можно создавать несколько символических ссылок на один файл и эти ссылки могут иметь разные имена.
Связь между символической ссылкой и файлом, на который она указывает, является «мягкой». Если удалить символическую ссылку, то файл, на который она указывает, не удаляется.
Если удалить файл, на который указывает ссылка, то сама ссылка не обновляется и остается на диске. При этом она указывает на уже несуществующий файл. Аналогично, если переименовать или переместить целевой файл, то ссылка не обновляется автоматически.
При создании символических ссылок можно указывать относительный путь до целевого файла. В таком случае ссылка считает, что относительный путь указан относительно каталога, в котором создана сама ссылка (но не относительно каталога, из которого она была создана).
Схематично отношение между файлом, символической ссылкой и данными, которые хранятся в файле, можно показать следующим образом:
Что такое жесткие ссылки
Жесткая ссылка (hard link) является своего рода синонимом для существующего файла. Когда вы создаете жесткую ссылку, создается дополнительный указатель на существующий файл, но не копия файла.
Жесткие ссылки выглядят в файловой структуре как еще один файл. Если вы создаете жесткую ссылку в том же каталоге, где находится целевой файл, то они должны иметь разные имена. Жесткая ссылка на файл должна находится в той же файловой системе, где и другие жесткие ссылки на этот файл.
В Linux каждый файл имеет уникальный идентификатор — индексный дескриптор (inode). Это число, которое однозначно идентифицирует файл в файловой системе. Жесткая ссылка и файл, для которой она создавалась имеют одинаковые inode. Поэтому жесткая ссылка имеет те же права доступа, владельца и время последней модификации, что и целевой файл. Различаются только имена файлов. Фактически жесткая ссылка это еще одно имя для файла.
Жесткие ссылки нельзя создавать для директорий.
Жесткая ссылка не может указывать на несуществующий файл.
Жесткие ссылки появились раньше, чем символические, но сейчас уже устаревают. В повседневной работе жесткие ссылки используются редко.
Схематично отношение между исходным файлом, жесткой ссылкой и данными можно показать следующей схемой:
Отличия символических ссылок от жестких
Кратко подведем итог, написанного выше.
Символическая ссылка:
- Указывает на целевой файл или каталог. Фактически является небольшим файлом, содержащим путь до целевого файла.
- Не содержит внутри себя содержимого самого файла. Содержит путь к целевому файлу.
- Имеет собственные права доступа, которые не распространяются на целевой файл.
- Удаление / переименование / перемещение целевого файла не обновляет автоматически ссылку. Ссылка начинает указывать на несуществующий файл, становится неработающей.
- Изменение прав доступа у целевого файла не обновляет права доступа у ссылки.
- Может быть создана для директории.
- Ссылка и целевой файл имеют разные файловые индексы (inode) в файловой системе.
- Может указывать на несуществующий файл.
- Символическая ссылка может использовать относительный путь до целевого файла.
Жесткая ссылка:
- Является своего рода еще одним именем на файл.
- Не может указывать на директорию.
- Нельзя создавать жесткие ссылки между файлами разных файловых систем.
- Не может указывать на несуществующий файл.
- Жесткая ссылка и файл, для которого она создавалась, имеют одинаковые индексы (inode) в файловой системе.
Как создавать ссылки в Linux. Команда ln
Для создания ссылок в Linux используется команда ln (от слова link).
Синтаксис команды ln :
ln опции целевой_файл имя_ссылки
Обычно используется только одна опция -s . Полный список опций можно получить, выполнив команду man ln.
Создание символических ссылок
Чтобы создать символическую ссылку, нужно выполнить команду ln с опцией -s :
ln -s целевой_файл имя_символьной_ссылки
Например, создадим в текущем каталоге символическую ссылку с именем mylink на файл /home/pingvinus/myfile :
ln -s /home/pingvinus/myfile.txt mylink
Выполнив команду ls -li , можно увидеть, что ссылка myfile указывает на файл /home/pingvinus/myfile
ls -li 792300 -rw-rw-r-- 1 pingvinus pingvinus 13 фев 13 13:07 myfile.txt 787622 lrwxrwxrwx 1 pingvinus pingvinus 10 фев 13 13:08 mylink -> /home/pingvinus/pingvinus/myfile
Обратите внимание, что ссылка и целевой файл имеют разные inode (792300 и 787622. См. число в начале строки).
Если теперь удалить целевой файл, а затем попробовать просмотреть его содержимое, используя ссылку, то получим сообщение о том, что файл не найден:
rm myfile.txt ls -li 787622 lrwxrwxrwx 1 pingvinus pingvinus 10 фев 13 13:08 mylink -> /home/pingvinus/pingvinus/myfile cat mylink cat: mylink: Нет такого файла или каталога
Пример создания и использования символьной ссылки (при создании ссылки используется относительный путь до целевого файла, если такую ссылку переместить, то она будет невалидна):
Создание жестких ссылок
Чтобы создать жесткую ссылку нужно использовать команду ln без опции -s .
ln целевой_файл имя_жесткой_ссылки
Например, создадим жесткую ссылку с именем hardlinktofile на файл myfile.txt :
ln myfile.txt hardlinktofile
Выведем список файлов:
ls -li 787622 -rw-rw-r-- 2 pingvinus pingvinus 13 фев 13 13:19 hardlinktofile 787622 -rw-rw-r-- 2 pingvinus pingvinus 13 фев 13 13:19 myfile.txt
Можно заметить, что hardlinktofile и myfile.txt имеют одинаковый inode=787622, так как являются фактически разными именами для одного файла (inode которого 787622).
Также видно, что на данный inode имеется 2 ссылки (см. цифру 2 в 3-м столбце). Если мы удалим исходный файл, то количество ссылок на него уменьшается на 1, то есть на самом деле файл не удаляется, так как на него больше, чем 1 ссылка. И мы по прежнему можем работать с файлом по имени hardlinktofile.
rm myfile.txt ls -li 787622 -rw-rw-r-- 1 pingvinus pingvinus 13 фев 13 13:19 hardlinktofile cat hardlinktofile Hello World!
Обратите внимание, что после выполнения команды rm, количество ссылок на файл стало равно 1.
Пример создания и использования жесткой ссылки:
Как удалить ссылку
Ссылки, как и обычные файлы, можно удалять, используя команду rm :
rm имя_ссылки
Создание ссылок через файловый менеджер
Некоторые графические файловые менеджеры поддерживают создание символических ссылок. Чтобы создать символическую ссылку в таком файловом менеджере, достаточно кликнуть правой кнопкой мыши по файлу и выбрать в меню пункт Создать ссылку ( Create Link , Make Link ).
Ссылка создается в том же каталоге, где находится целевой файл. После создания ссылку можно переместить в другой каталог.
Резюме
Ссылки — это удобный инструмент при работе с файлами в Linux. Мы рассмотрели два вида ссылок, которые существуют в Linux. Рассмотрели отличия символических ссылок от жестких. Для создания ссылок используется команда ln . При повседневной работе обычно используются символические ссылки, в то время как жесткие ссылки используются редко.
Символические ссылки: основы работы
Символическая ссылка (симлинк, англ. symbolic link, symlink) позволяют связывать файлы и каталоги с другими файлами и каталогами. У таких ссылок есть много названий: их называют ссылками оболочки, программными или «мягкими» ссылками, ярлыками и псевдонимамами. С точки зрения пользователя символические ссылки очень похожи на обычные файлы и каталоги. Однако, взаимодействуя с ними, вы фактически взаимодействуете с целевым объектом на другом конце ссылки. Поэтому симлинк проще всего представить в виде червоточины в вашей файловой системе.
В этом руководстве мы поговорим о том, что такое символические ссылки и как их создавать с помощью командной строки Linux и команды ln.
Требования
Чтобы следовать этому руководству, вам потребуется доступ к компьютеру с операционной системой Linux. Подойдет и виртуальный сервер, к которому вы подключаетесь через SSH, и просто ваш локальный компьютер. Обратите внимание: мы проверили данный мануал на сервере Ubuntu 20.04, но приведенные в нем команды и примеры должны работать на компьютерах с любой версией любого дистрибутива Linux.
Если для выполнения инструкций вы планируете использовать свежий удаленный сервер, мы рекомендуем вам сначала подготовить сервер к работе с помощью этого материала. Вы узнаете, как настроить безопасную серверную среду, в том числе пользователя sudo и брандмауэр UFW.
Создание тестовой файловой системы
Системный вызов, необходимый для создания символических ссылок, обычно доступен в Unix-подобных и POSIX-совместимых операционных системах. Для создания ссылок мы будем использовать команду ln.
Чтобы попрактиковаться в создании символических ссылок, вы, конечно, можете использовать уже существующие в системе файлы. Однако мы рекомендуем создать специальную тестовую среду, в которой вы сможете попрактиковаться без ущерба для своей текущей файловой системы. В этом разделе вы найдете несколько команд, которые помогут вам подготовить такую среду.
Для начала давайте создадим в каталоге /tmp/ пару новых каталогов. Каталог /tmp/ предназначен для временных (temporary) файлов, то есть все хранящиеся здесь файлы и каталоги будут удалены при следующей загрузке сервера. Это очень удобно: вы можете создать столько каталогов, файлов и ссылок, сколько захотите, и не беспокоиться о том, что впоследствии они засорят систему.
Следующая команда mkdir создает сразу три каталога: сначала каталог symlinks/ внутри /tmp/, а затем – каталоги one/ и two/ внутри symlinks/.
mkdir -p /tmp/symlinks/
Перейдите в новый каталог symlinks/:
Создайте здесь пару тестовых файлов, по одному в каждом из подкаталогов внутри symlinks/. Следующая команда создает в подкаталоге one/ файл one.txt, единственным содержимым которого является строка one:
echo «one» > ./one/one.txt
Аналогично, следующая команда создает в подкаталоге two/ файл two.txt, который содержит только строку two:
echo «two» > ./two/two.txt
Если на этом этапе запустить команду tree, чтобы отобразить содержимое каталога /tmp/symlinks и всех вложенных подкаталогов, мы получили бы такой вывод:
. ├── one │ └── one.txt └── two └── two.txt 2 directories, 2 files
Примечание: Если команда tree не установлена на вашем компьютере по умолчанию, вы можете установить ее с помощью стандартного менеджера пакетов вашей системы. Например, в Ubuntu установить ее можно с помощью apt:
sudo apt install tree
Итак, мы подготовили среду и теперь можем попрактиковаться в создании символических ссылок.
Что такое жесткие ссылки?
Жесткая ссылка – это зеркальная копия исходного файла с точно таким же содержимым.
Допустим, у вас есть текстовый файл. Если вы отредактируете содержимое исходного файла, эти изменения отразятся в жесткой ссылке. Однако если вы удалите исходный файл, жесткая ссылка все равно будет работать, и вы сможете просматривать и редактировать ее, как обычную копию исходного файла. Создавая символическую ссылку на этот файл, вы по сути получаете только указатель на исходный файл. Если вы удалите исходный файл, символическая ссылка сломается, так как больше она никуда не ведет.
Жесткие ссылки широко применяются, но в некоторых случаях их следует избегать. Например, избегать их нужно внутри репозитория git, поскольку они могут создать путаницу.
По умолчанию команда ln создает жесткие ссылки. Чтобы с ее помощью создать симлинк, команде ln нужно передать параметр -s (или –symbolic).
Примечание: Поскольку символические ссылки используются чаще, чем жесткие, вы можете сразу создать псевдоним для команды ln -s:
Конечно, это сэкономит вам всего несколько нажатий клавиш, но если вы создаете много символических ссылок, это может значительно упростить вам работу.
Работа с символическими ссылками
Как мы говорили ранее, создание символической ссылки – это по сути создание файла, содержащего имя целевого файла и путь к нему. Поскольку символическая ссылка – это просто ссылка на исходный файл, любые изменения, внесенные в исходный файл, будут немедленно доступны в симлинке.
Одним из возможных вариантов использования симлинков является создание в домашнем каталоге пользователя локальных каталогов, указывающих на файлы, синхронизируемые с внешним приложением, например Dropbox. Еще один вариант – создать символическую ссылку, указывающую на последнюю сборку проекта, которая находится в каталоге с динамическим именем.
На примере файлов и каталогов (мы создали их в первом разделе) попробуйте создать символическую ссылку по имени three, которая указывает на каталог one:
Теперь у вас должно быть 3 каталога, один из которых указывает на другой. Чтобы получить более подробный обзор текущей структуры каталогов, вы можете использовать команду ls и вывести содержимое текущего рабочего каталога:
one three two
Теперь в каталоге symlinks/ есть три каталога. В зависимости от вашей системы это может означать, что каталог three на самом деле является символической ссылкой. Иногда в выводе имя ссылки выделяется другим цветом или к нему добавляется символ @.
Для большей детализации вывода вы можете передать команде ls аргумент -l, чтобы определить, куда на самом деле указывает символическая ссылка:
На экране появится:
total 8 drwxrwxr-x 2 8host 8host 4096 Oct 30 19:51 one lrwxrwxrwx 1 8host 8host 3 Oct 30 19:55 three -> one drwxrwxr-x 2 8host 8host 4096 Oct 30 19:51 two
Обратите внимание, ссылка three указывает на каталог one, как и ожидалось. Кроме того, в выводе его имя начинается с l, что указывает на то, что это ссылка. Два других элемента начинаются с d, что означает, что это обычные каталоги.
Символические ссылки также могут содержать символические ссылки. В качестве примера давайте попробуем связать файл one.txt из каталога three с каталогом two:
ln -s three/one.txt two/one.txt
Теперь у вас должен быть файл one.txt внутри каталога two. Вы можете проверить это с помощью следующей команды ls:
total 4 lrwxrwxrwx 1 8host 8host 13 Oct 30 19:58 one.txt -> three/one.txt -rw-rw-r-- 1 8host 8host 4 Oct 30 19:51 two.txt
В зависимости от конфигурации вашего терминала ссылка (выделенная выше) может отображаться в красном цвете, что указывает на то, что она не работает. Хотя ссылка и была создана, но для ее создания использовался относительный путь. Ссылка не работает, потому что каталог two не содержит каталога three с файлом one.txt в нем.
К счастью, вы можете исправить эту ситуацию при помощи команды ln. Она может создать симлинк относительно расположения ссылки с помощью аргумента -r (или –relative).
Однако даже с флагом -r вы не сможете исправить неработающую символическую ссылку. Причина ошибки в том, что символическая ссылка уже существует, и вы не сможете перезаписать ее, не добавив аргумент -f (или –force):
ln -srf three/one.txt two/one.txt
Теперь у вас есть файл two/one.txt, он связан с three/one.txt, который является ссылкой на one/one.txt.
Вложение символических ссылок может быстро превратиться в путаницу, но многие приложения умеют делать подобные структуры ссылок более понятными. Например, команда tree покажет, что отображаемая цель ссылки на самом деле соответствует расположению исходного файла, а не самой ссылке:
. ├── one │ └── one.txt ├── three -> one └── two ├── one.txt -> ../one/one.txt └── two.txt 3 directories, 3 files
Теперь, когда все файлы связаны ссылками, мы можем взглянуть, как символические ссылки работают с файлами, если в содержимое файла меняется.
Чтобы понять, что содержат ваши файлы, выполните следующую команду cat.
Она выведет на экран содержимое файла one.txt в каждом из трех каталогов, созданных вами в этом руководстве:
one one one
Затем обновите содержимое исходного файла one.txt в каталоге one/:
echo «1. One» > one/one.txt
Снова проверьте содержимое каждого файла:
Вы получите такой результат:
1. One 1. One 1. One
Эти данные подтверждают, что любые изменения, внесенные в исходный файл, будут немедленно отражены в симлинках.
Теперь попробуем сделать обратное – изменить содержимое одной из символических ссылок. Выполните следующую команду, чтобы изменить содержимое файла one.txt в каталоге three/:
echo «One and done» > three/one.txt
Затем еще раз проверьте содержимое каждого файла:
На экране появится:
One and done One and done One and done
Поскольку измененная вами символическая ссылка является указателем на другой файл, любое изменение, внесенное в симлинк, будет немедленно отражено в исходном файле, а также в любых других его симлинках.
Заключение
Символические ссылки невероятно полезны, но у них есть определенные ограничения. Имейте в виду: если вы переместите или удалите исходный файл или каталог, все существующие симлинки, указывающие на него, будут повреждены. Этот сценарий не предлагает автоматического обновления или исправления. Однако если вы будете работать осторожно, вы найдете символическим ссылкам множество применений.