7

Я использую msysgit в Windows, чтобы использовать git, но я часто хочу перемещаться по ярлыку в стиле *.lnk стиле Windows. Обычно я управляю своей файловой структурой через проводник Windows, поэтому использование ярлыков другого типа (например, создание жестких или программных ссылок в git) невозможно. Как бы я прошел через этот тип ярлыка?

Например:

PCUser@PCName ~
$ cd Desktop

PCUser@PCName ~/Desktop
$ ls
Scripts.lnk

PCUser@PCName ~/Desktop
$ cd Scripts.lnk
sh.exe": cd: Scripts.lnk: Not a directory

Можно ли изменить это поведение, чтобы вместо получения ошибки оно просто отправлялось в каталог? В качестве альтернативы, есть ли команда для получения пути в файле *.lnk ?

РЕДАКТИРОВАТЬ: я слышал, что обратное это существует для Cygwin, что позволяет вам создать символическую ссылку, которая работает с проводником.

5 ответов5

6

* Гм *

Сначала скомпилируйте следующий скрипт AutoHotkey :

FileGetShortcut, %1%, shortcut_target
FileAppend, %shortcut_target%, *
ExitApp

Поместите .EXE файл в каталоге % PATH% . Я назвал мой follow.exe .

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

cd `follow Shortcut.lnk`

где целью Shortcut.lnk является действительный каталог.


Демонстрация:

сокращенный

мерзавец


После настройки follow.exe вы можете добавить следующую функцию оболочки в файл ~/.bashrc чтобы еще больше упростить синтаксис. Спасибо, Даниэль !

function cd
{
    if [[ ".lnk" = "${1:(-4)}" && -f "$1" ]] ;
        then builtin cd "$( follow "$1" )" ;
    else builtin cd "$1" ;
    fi
}

Теперь вы можете следить .LNK файлы только с cd !

cd Shortcut.lnk

Демонстрация:

CD

3

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

О создании символики в msys

Обновить:

Спасибо iglvzx за ваш ответ.

Тем не менее, в моем случае иногда автозаполнение bash ставит / после ярлыка, например cd /f/downloads/scripts.lnk/ , поэтому я использую его в качестве предлога, чтобы поиграть со сценариями bash и настроить ваш сценарий, также проверяя на неприемлемость ярлыки (неработающие или указывающие на файлы):

cd() {

    shopt -s nocasematch

    if [[ -z "$1" ]];
        then
            echo Error: missing operand;
            return 1;
    fi;

    if [[ "$1" == "/" ]];
        then
            destination=$1;
        else
            destination=${1%/};
    fi;

    extension=${destination##*.}

    if [[ -f "$destination" && $extension == "lnk" ]];
        then

            finaldestination=`follow "$destination"`;

            if [[ -z "$finaldestination" ]];
                then
                    echo Error: invalid destination;
                    return 2;
            fi;

            if [[ -f "$finaldestination" ]];
                then
                    echo Error: destination is a file;
                    return 3;
            fi;

            builtin cd "$finaldestination";

        else
            builtin cd "$destination";
    fi;
}
1

Открытие ярлыков из msys возможно с помощью cmd через флаг /C :

cmd //C "C:\Shortcut.lnk"

Если это ярлык для папки, она будет открыта. Слэш должен быть экранирован, чтобы msys не конвертировала /C в C:\ .

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

cmd //C Shortcut.lnk
1

Если вы сделаете символическую ссылку (используя mklink /D <link name> <target dir> из cmd с правами администратора) вместо ярлыка, git bash может следовать за ним с помощью cd -P <link name> .

0

Ух, классный подход, iglvzx ! Я рекомендую небольшое улучшение вашего сценария ~/.bashrc чтобы простой cd без каких-либо аргументов по-прежнему изменялся в домашнем каталоге пользователя.

function cd
{
    if [[ ".lnk" = "${1:(-4)}" && -f "$1" ]] ;
        then builtin cd "$( follow "$1" )" ;
    elif [[ -z "$1" ]] ;
        then builtin cd ;
    else 
        builtin cd "$1" ;
    fi
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .