Включить собственные символические ссылки 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 или символическую ссылку NTFS?
Другой вопрос: это доступно на MinGW?
4 ответа
⸻⸻⸻ Короткий ответ ⸻⸻⸻
Определите переменную среды:
CYGWIN=winsymlinks:nativestrict
Как указывает mwm, вам также может mwm запустить bash от имени администратора.
⸻⸻⸻ длинный ответ ⸻⸻⸻
Симлинки по умолчанию - это обычные файлы
По умолчанию 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
Cygwin создает символические ссылки как родные символические ссылки Windows для файловых систем и версий ОС, поддерживающих их. Если известно, что ОС не поддерживает собственные символические ссылки (Windows XP, Windows Server 2003), предупреждающее сообщение выдается один раз за сеанс.Разница между
winsymlinks:native
а такжеwinsymlinks:nativestrict
заключается в следующем: если файловая система поддерживает нативные символические ссылки, и Cygwin по какой-то причине не может создать нативную символическую ссылку, она вернется к созданию символических ссылок по умолчанию Cygwin сwinsymlinks:native
в то время как сwinsymlinks:nativestrict
symlink(2)
Системный вызов немедленно завершится ошибкой.
CYGWIN=winsymlinks:native
всегда создает ссылку, но использует запасной вариант Cygwin, когда цель не существует
на 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, но не работает, если цель не существует
на 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, Дополнительно → Запуск от имени администратора).
Принятый ответ правильный, два небольших примечания.
Если вас интересуют только те символические ссылки, которые вы создаете сами в командной строке, установите 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
PS Сначала я использовал CYGWIN=winsymlinks:nativestrict
, но потом я узнал, что в этом режиме ln -s target link
не удается, если target
не существует В отличие от native
создаст символическую ссылку (не нативную) Cygwin link
указывая на несуществующее target
- это соответствует поведению ln
в системах UNIX. В редких случаях nativestrict
может сломать некоторые программы или скрипты, например Gentoo run-crons
Скрипт использует файл блокировки, который является символической ссылкой, указывающей на PID запущенного процесса. В nativestrict
В режиме перестал работать скрипт, так как он больше не мог создавать файл блокировки. Замечания: run-crons
вспомогательный скрипт crontab в Gentoo Linux, добавляющий поддержку cron.{hourly,daily,weekly,monthly}/
Дирс, это очень хорошо работает с 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), чтобы запустить вышеуказанное без проблем.
Обратите внимание, что я не знаю, есть ли какая-либо разница между символической ссылкой на абсолютный путь и символической ссылкой на относительный путь с использованием CMD mklink
, В Linux эти два поведения отличаются, если вы когда-нибудь решите переместить символическую ссылку или переместить целевой файл, или переместите оба.
Я думаю, что самый простой способ это
предоставить SeCreateSymbolicLinkPrivilege из редактора локальной групповой политики (gpedit.msc, по умолчанию путь, не домашние версии)
создать скрипт с именем
ln
on path (batch или bash), реализация аналогична описанной выше функции оболочкиприбыль
Вы, вероятно, искали способ добраться до другого места назначения в дереве каталогов с помощью MSYS. Есть выход. Вы должны создать скрипт оболочки (файл "*.sh"), который содержит строку:
cd "/drive_letter/SubCatalogue/SubFolder/..."