Включить собственные символьные ссылки NTFS для Cygwin


Последние NTFS и Windows реализуют символьные ссылки:

  • точка соединения NTFS может использоваться в качестве символьной ссылки на каталог начиная с NTFS 3.0 (Windows 2000) с помощью инструментов linkd или junction.
  • символическая ссылка NTFS также может использоваться в качестве символьной ссылки (как для файла, так и для каталога), так как Windows Vista использует инструмент mklink.
Но на Cygwin 1.7 (установлен на Windows 7), ln -s создает текстовый файл.

На Cygwin:

$ ln -s -v target mylink
`mylink' -> `target'

На MinGW (или ваш любимый редактор):

$ cat mylink
!<symlink>ÿþt a r g e t 

Можно ли сказать Cygwing использовать NTFS junction point или NTFS symbolic link ?

Другой вопрос: доступно ли это на MinGW?

4 39

4 ответа:

Краткий ответ

Определить переменную окружения:

CYGWIN=winsymlinks:nativestrict

Как указывает mwm, вам также может потребоваться запустить bash в качестве администратора.

Ответ

По умолчанию символические ссылки Cygwin - это обычные файлы

По умолчанию Cygwin создает текстовые файлы в качестве обходного пути для ошибки символьной ссылки Windows. Эти файлы на самом деле не являютсясимвольными ссылками . Почти все программы Windows не рассматривают эти файлы как символьная ссылка.

Собственные символьные ссылки доступны в последних версиях Windows

Последние NTFS и Windows реализуют символьные ссылки:

  • точка соединения NTFS может использоваться в качестве символьной ссылки каталога начиная с NTFS 3.0 (Windows 2000) с помощью инструментов linkd или junction.
  • символическая ссылка NTFS также может использоваться в качестве символьной ссылки (как для файла, так и для каталога) начиная с Windows Vista с помощью инструмента mklink.

Cygwin может создавать собственные NTFS символические ссылки

Упрощенная выписка из документации Cygwin :

Символические ссылки

[...]

Cygwin создает символические ссылки потенциально несколькими различными способами:

  • Символические ссылки по умолчанию-это простые файлы, содержащие волшебный файл cookie далее следует путь, на который указывает ссылка. [...]

  • Символьные ссылки в стиле ярлыков-это Windows .lnk [...] создан если окружающая среда переменная CYGWIN [...] устанавливается, чтобы содержать строка winsymlinks или winsymlinks:lnk. [...]

  • Собственные символьные ссылки Windows создаются только в Windows Vista / 2008 и более поздних версиях, и только на файловых системах, поддерживающих точки повторного анализа. Из-за их странных ограничений и поведения, они только созданы если пользователь явно запрашивает их создание. Это делается путем установки переменной среды CYGWIN содержать строку winsymlinks:native или winsymlinks:nativestrict. [...]

  • О том, что Файловая система NFS, Cygwin всегда создает реальные символьные ссылки NFS.

Настройка Cygwin

Руководство пользователя Cygwin представляет переменную CYGWIN и опцию winsymlinks:

Переменная окружения CYGWIN используется для настройки многих глобальных параметров [...]. Он содержит параметры, перечисленные ниже, разделенные пустыми символами. [...]

  • [...]
  • [...]
  • [...]
  • [...]
  • winsymlinks:{lnk,native,nativestrict} - если задано значение просто winsymlinks или winsymlinks:lnk, Cygwin создает символьные ссылки как ярлыки Windows со специальным заголовком и набором атрибутов R/O.

    Если задано значение winsymlinks:native или winsymlinks:nativestrict, Программа создает симлинки как родной Windows ссылки на файловые системы и версии ОС, поддерживающие их. Если известно, что ОС не поддерживает собственные символьные ссылки (Windows XP, Windows Server 2003), предупреждающее сообщение производится один раз за сеанс.

    Разница между winsymlinks:native и winsymlinks:nativestrict заключается в следующем: если файловая система поддерживает native symlinks и Cygwin не удается создать собственную символическую ссылку по какой-то причине, он вернется к созданию символьных ссылок Cygwin по умолчанию с помощью winsymlinks:native, в то время как с winsymlinks:nativestrict системный вызов symlink(2) немедленно завершится ошибкой.

CYGWIN=winsymlinks:native
всегда создает ссылку, но использует резервную копию Cygwin, когда target не существует

На Cygwin:

$ export CYGWIN="winsymlinks:native"
$ ln -s -v target mylink
`mylink' -> `target'
$ echo content > target

На MinGW:

$ cat mylink
content

Люди, использующие программы Windows и Cygwin, могут иметь проблемы, когда символьная ссылка создается как фиктивный файл (резервная копия Cygwin, когда цель отсутствует)...

CYGWIN=winsymlinks:nativestrict
всегда использует символьную ссылку native-Windows, но терпит неудачу, когда target не существует

На Cygwin:

$ export CYGWIN="winsymlinks:nativestrict"
$ rm -f  a b
$ ln -sv a b
ln: failed to create symbolic link `b': No such file or directory
$ touch    b
$ ln -sv a b
ln: failed to create symbolic link `b': File exists
$ rm b
$ touch a
$ ln -sv a b
`b' -> `a'

Потому что nativestrict Если цель существует до создания символьной ссылки, некоторые команды / сценарии могут завершиться ошибкой при создании ссылки.

Примечание: только администраторы имеют возможность создавать собственные символические ссылки NT так под Windows UAC, эмулятор терминала Cygwin (mintty) должен выполняться с повышенными привилегиями (щелкните правой кнопкой мыши ярлык и выберите Запуск от имени администратора или установите свойство mintty shortcut, Advanced → Run as Administrator ).

особая благодарность Гуриии Спуки за их вклад.

Общепринятый ответ-правильный, две маленькие побочные заметки.

Если вы заботитесь только о символических ссылках, которые вы создаете сами в командной строке, установите пакет cygutils-extra, он включает команду winln, которая имеет тот же синтаксис, что и ln, но создает собственные ссылки Windows. Создайте псевдоним: alias ln=winln (работает только в интерактивной оболочке) или даже замените файл ln на winln (работает также в скриптах оболочки) - но он может быть перезаписан при следующем обновлении пакета coreutils.

У меня есть я только узнал, что можно использовать нативные символьные ссылки, когда у меня уже был установлен Cygwin, и добавил некоторые символьные ссылки сам. Поэтому после того, как я установил CYGWIN=winsymlinks:native в качестве переменной окружения моей системы, я хотел преобразовать все существующие неродные ссылки в родные. Вот что я сделал.

На всякий случай сначала создайте резервную копию всего каталога Cygwin.

Найдите все символьные ссылки и сохраните список в файл /links : cd /; find . -regextype egrep -regex './(dev|proc|mnt|cygdrive)' -prune -o -type l -print >links

Обзор links. Создайте архив tar со всеми ссылками: tar c --files-from=links >links.tar

Извлечение архива tar: tar x --files-from=links <links.tar Поскольку теперь включены собственные символьные ссылки, tar заменит старые символьные ссылки Cygwin на собственные символьные ссылки.

Очистка: rm -f links links.tar

P.S. сначала я использовал CYGWIN=winsymlinks:nativestrict, но потом обнаружил, что в этом режиме ln -s target link терпит неудачу, если target не существует. Напротив, native создаст символическую ссылку Cygwin (неродную) link, указывающую на несуществующую target-Это соответствует поведению ln в системах UNIX. В редких случаях nativestrict может разбейте некоторые программы или скрипты, например Gentoo run-crons script использует файл блокировки, который является символьной ссылкой, указывающей на PID запущенного процесса. В режиме nativestrict скрипт перестал работать, так как больше не мог создать файл блокировки. Примечание: run-crons - это вспомогательный скрипт crontab на Gentoo Linux, добавляющий поддержку cron.{hourly,daily,weekly,monthly}/ dirs, он очень хорошо работает с Cygwin.

Поскольку ответ @olibre не сработал для меня. Я только что создал функцию оболочки.

: '
mklink - Create NTFS (Windows) links that is usable by Windows and Cygwin

Usage: mklink [/D | /H | /J] <link-path> <target-path>

Options:
    /D    Directory Symbolic Link
    /H    Hardlink
    /J    Directory Junction (you should prefer /D)

With no options, it creates a NTFS file symlink.
'
mklink () {

    if [ "$#" -ge "3" ]; then
        cmd /c mklink "$1" "$(cygpath --windows --absolute "$2")" "$(cygpath --windows --absolute "$3")"
    else
        cmd /c mklink "$(cygpath --windows --absolute "$1")" "$(cygpath --windows --absolute "$2")"
    fi

}

Обратите внимание, что вам нужны права администратора (для Cygwin), чтобы выполнить вышеописанное без проблем.

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

Вероятно, вы искали способ добраться до другого пункта назначения в дереве каталогов с помощью MSYS. Есть способ. Вы должны создать скрипт оболочки (файл"*. sh"), который содержит строку:

cd "/drive_letter/SubCatalogue/SubFolder/..."