Есть ли для Linux аналог виндовой команды mklink?

Любые разговоры которые хоть как-то связаны с тематикой форума

Модератор: Модераторы разделов

MiK13
Сообщения: 1204
ОС: Linux Debian

Есть ли для Linux аналог виндовой команды mklink?

Сообщение MiK13 »

В Linux на устройствах хранения информации могут находиться файлы трёх основных типов:
  1. Обычные файлы, содержащие последовательность байтов (они могут иметь несколько имён)
  2. Файлы, содержащие имена других файлов (каталоги)
  3. Файлы, содержащие путь к другим файлам (ссылки)
Windosw на NTFS понимает файлы первых двух типов, но не понимает ссылки. Вместо них видит простой файл.
Но в Windows есть команда mklink, с помощью которой тоже можно создавать ссылки.

Shell

G:\>mklink
Создает символьную ссылку.

MKLINK [[/D] | [/H] | [/J]] Ссылка Назначение

/D Создает символьную ссылку на каталог.
По умолчанию создается символьная ссылка на файл.
/H Создает жесткую связь вместо символьной ссылки.
/J Создает соединение для каталога.
Ссылка Указывает имя новой символьной ссылки.
Назначение Указывает путь (относительный или абсолютный), на который ссылается
новая ссылка.
Я на внешнем накопителе с разделом NTFS в Linux командами mkdir D1l и ln -s D1l D1l-sl создал каталог и ссылку на него.
Затем загрузил Windows и командами mklink /D D1-dw и mklink /J D1-jw создал ссылку и соединение для каталога D1l. И вот что увидел.
В Windows:

Shell

G:\>dir /a
Том в устройстве G имеет метку Transcend
Серийный номер тома: F0ED-003E

Содержимое папки G:\

Сб 08.06.24 15:54 <DIR> !
Сб 08.06.24 15:52 <DIR> D1l
Сб 08.06.24 15:59 <SYMLINKD> D1l-dw [D1l]
Сб 08.06.24 15:59 <JUNCTION> D1l-jw [G:\D1l]
Сб 08.06.24 15:52 14 D1l-sl
Сб 08.06.24 15:57 <DIR> System Volume Information
1 файлов 14 байт
5 папок 4 000 278 511 616 байт свободно
В Linux:

Shell

mik13@MD5:/media/mik13/Tr4$ ls -li
итого 5
66 drwxrwxrwx 1 mik13 mik13 0 июн 8 15:54 '!'
64 drwxrwxrwx 1 mik13 mik13 0 июн 8 15:52 D1l
48 lrwxrwxrwx 1 mik13 mik13 3 июн 8 15:59 D1l-dw -> D1l
49 lrwxrwxrwx 1 mik13 mik13 20 июн 8 15:59 D1l-jw -> /media/mik13/Tr4/D1l
65 lrwxrwxrwx 1 mik13 mik13 3 июн 8 15:52 D1l-sl -> D1l
50 -rwxrwxrwx 1 mik13 mik13 1043 июн 8 16:01 dir
45 drwxrwxrwx 1 mik13 mik13 0 июн 8 15:57 'System Volume Information'
То есть как SYMLINKD, так и JUNCTION, созданные в Windows, Linux нормально понимает.
Но как создавать ссылки на каталоги, которые бы понимал Windows?

P.S. ChatGPT сказал, что есть утилита lnk2symlink, которые предоставляют поддержку создания символических ссылок, понятных и в Windows, и в Linux.
Что это за утилита и где её можно найти?
Спасибо сказали:
Аватара пользователя
UnixNoob
Сообщения: 1424
ОС: Slackware

Re: Есть ли для Linux аналог виндовой команды mklink?

Сообщение UnixNoob »

MiK13 писал:
08.06.2024 17:56
предоставляют поддержку создания символических ссылок, понятных и в Windows, и в Linux.
Очень вряд ли такое возможно, учитывая что пишут следующее:
Symlinks on Linux are implemented differently than on Windows:

On Windows a symlink is a file-table entry that's implemented and manipulated by kernel calls
On Linux, a symlink is simply a text file with a special flag, whose content is a path to the destination. (The path doesn’t even have to be valid.)
MiK13 писал:
08.06.2024 17:56
lnk2symlink
Речь наверно о скрипте
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2761
ОС: Gentoo

Re: Есть ли для Linux аналог виндовой команды mklink?

Сообщение ormorph »

MiK13 писал:
08.06.2024 17:56
P.S. ChatGPT сказал, что есть утилита lnk2symlink, которые предоставляют поддержку создания символических ссылок, понятных и в Windows, и в Linux.
Обычный скрипт, который создаёт файл .lnk, но это не то же самое что и mklink. Как аналог этой команды(mklink) под виндой работает так на python:

Код: Выделить всё

from pathlib import Path

p = Path( 'mylink' )
p.symlink_to( 'mytarget' )
Где mylink это ссылка на mytarget.
Вот только если в wine python запустить это не работает. Тут либо особенность драйвера NTFS либо права на создание ссылок.
Спасибо сказали:
MiK13
Сообщения: 1204
ОС: Linux Debian

Re: Есть ли для Linux аналог виндовой команды mklink?

Сообщение MiK13 »

UnixNoob писал:
08.06.2024 20:40
MiK13 писал:
08.06.2024 17:56
предоставляют поддержку создания символических ссылок, понятных и в Windows, и в Linux.
Очень вряд ли такое возможно, учитывая что пишут следующее:
Symlinks on Linux are implemented differently than on Windows:

On Windows a symlink is a file-table entry that's implemented and manipulated by kernel calls
On Linux, a symlink is simply a text file with a special flag, whose content is a path to the destination. (The path doesn’t even have to be valid.)
Это понятно, что ссылки в Linux и Windows реализованы по-разному. Видно хотя бы из того, что ссылка под Linux под виндой видна как простой файл. В котором с некоторой дополнительной информацией находится текст ссылки.
Но дело в том, что то, что создаётся командой mklink Linux понимает. Причём, он понимает как "ссылки" (SYMLINKD), так и соединения (JUNCTION). И интерпретирует их как ссылки.
И тут есть одна особенность: команда dir ссылку, созданную с помощью mklink /D D1l-dw D1l показывает как
D1l-dw [D1l]
То есть по аналогии с Linux показывает на что ссылается, только не после "->", а в квадратных скобках.
А вот в ссылке-соединении, созданном с помощью mklink /J D1l-jw D1l показывает уже полный путь:
D1l-jw [G:\D1l]
То есть с указанием диска. А, возможно и каталога, если бы каталог D1l был в подкаталоге.
Linux же на эту ссылку показал, что она ссылается тоже на ПОЛНЫЙ путь к каталоге:
D1l-jw -> /media/mik13/Tr4/D1l
Я ещё не проверял, но, возможно, "JUNCTION" это что-то вроде "жёсткой ссылки" на каталог, то есть ещё одно имя каталога.
Проверю это позже, попытавшись с помощью mklink сделать ссылки на каталог, расположенный на другом диске.
В Linux "жёсткие" ссылки на каталоге не разрешены (хотя в каких-то системах рут это делать может)
Но если ntfs-3g понимает это, почему, при том, что он умеет писать на NTFS, не может это сделать? Или может?
Кстати, я как-то читал, что в ядро Linux собираются добавить возможность полноценной работы с NTFS. Раньше была возможность только читать эту систему. Может быть там можно будет делать ссылки, которые будет понимать винда?

А пока осталось решить ещё одну проблему. Сделать так, чтобы на NTFS можно было создавать имена, содержащие кавычки ('"')
Я как-то об этом спрашивал тут, но сейчас не могу найти как это решается. Какой-то правкой какого-то файла в /etc Я это сделал в Debian 11. Но когда он перестал работать был вынужден поставить Debian 12. А как решил ту проблему, пока вспомнить не могу.

P.S. Нашёл как решил эту проблему. Просто скопировал файл mount_options.conf из /etc/udisks2/, который остался в Debian 11 в текущий /etc/udisks2/. Он содержит:

Код: Выделить всё

[defaults]
ntfs_defaults=uid=$UID,gid=$GID,fmask=111,umask=0
vfat_defaults=uid=$UID,gid=$GID,shortname=mixed,utf8=1,showexec,flush,umask=0
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2761
ОС: Gentoo

Re: Есть ли для Linux аналог виндовой команды mklink?

Сообщение ormorph »

MiK13 писал:
09.06.2024 02:18
Но если ntfs-3g понимает это, почему, при том, что он умеет писать на NTFS, не может это сделать? Или может?
Тут скорее дело в самом ядре Linux. Нет системного вызова позволяющего делать ссылки на файлы в стиле винды. В wine функция fixme:file:CreateSymbolicLinkW не работает, т.е. является просто заглушкой. Можно задать вопрос разработчикам ядра и ntfs-3g, есть ли в наличии функция позволяющая это делать. То что ссылки Windows нормально отображает драйвер NTFS-3G не значит что можно ещё создавать эти ссылки в Linux.
Спасибо сказали: