Використовувати msysgit / “Git для Windows” для навігації по ярликах Windows?


8

Я використовую 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файл?

EDIT : Я чув, що для cygwin існує зворотне значення цього , що дозволяє створити симпосилання, яке працює з Explorer.


2
Насправді не відповідь на ваше запитання, але якщо ви використовуєте mklinkкоманду для створення м'якого посилання NTFS, я думаю, він буде працювати так, як ви цього хочете.
jcrawfordor

Відповіді:


6

* гм *

По- перше, скомпілювати наступний AutoHotkey скрипт:

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

Помістіть .EXEфайл у каталог % PATH% . Я назвав свою follow.exe.

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

cd `follow Shortcut.lnk`

де Shortcut.lnk«s мета є допустимим каталогом.


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

ярлик

git bash


Після налаштування 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


Це чудово! Я насправді дізнався про використання синтаксису галочки для оцінювання команд, але ця відповідь дає точний крок, який я пропустив. Дякую!! Мені просто цікаво одне - чи працює це для мережевих накопичувачів та / або мережевих локацій? Мені це для цього особливо не потрібно, але було б корисно знати. :)
Кейсі Кубалл

Якщо ви можете cdдосягти цілі , встановленої у файлі ярликів (наприклад, перегляньте перший знімок екрана), то це має спрацювати. Це просто заощадить вам пару кроків за допомогою AutoHotkey. :)
iglvzx

1
Дуже круто. Використовуючи функцію оболонки cd, ви могли це зробити автоматично, коли додавали до файлів lnk.
Даніель Бек

@DanielBeck Якби ви могли додати кроки для налаштування функції оболонки, це було б чудово!
iglvzx

1
Наразі немає доступних Bash для Windows для тестування, але він працює як описано тут . Це може працювати для визначення функції: function cd { if [[ ".lnk" = "${1:(-4)}" && -f "$1" ]] ; then builtin cd "$( follow "$1" )" ; else builtin cd "$1" ; fi }. Якщо ви CD Вишуканий файл з ім'ям *.lnk, використовуйте cdз follow, в іншому випадку використовуйте регулярними cd.
Даніель Бек

3

Схоже, що наразі це неможливо, і рекомендований підхід полягає у використанні утиліти Junction :

Про створення символічного на msys

Оновлення:

Дякую iglvzx за вашу відповідь.

Однак у моєму випадку іноді баш автозавершення ставиться /після ярлика, як-от 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;
}

Я хотів би, щоб я міг дати щедрість вашій відповіді, оскільки це відповідає на питання, що його не існує. Це чудово знати, але проблема полягає в тому, що я не вважаю управління файлами простішим у терміналі - я керую своїми файлами та ярликами за допомогою провідника, і тому не можу просто створити посилання. Дуже дякую!
Кейсі Кубалл

Хороша ідея проігнорувати будь-які слідові /символи. MinGW, здається, додає мені місця. Я думаю, що sh.exeвже перевіряє призначення для вас, тож це зайва робота для сценарію. Що було б цікаво побачити, це автоматично заповнення цільового каталогу.
Кейсі Кубалл

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>.


Це не погана ідея, але спочатку я намагався керувати своїми ярликами строго через GUI, і в графічному інтерфейсі немає простого рішення для створення симпосилання. Можливо, полегшення цього процесу стане альтернативним способом отримати подібну поведінку в графічному інтерфейсі та командному рядку.
Кейсі Кубалл

Це хороший момент. Ви не можете створити символьні посилання у провіднику файлів, але ви можете слідувати за ними з файлового провідника, як би це було ярликом. BTW, я думаю, що це працює лише на Windows 10.
user4757074

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
}

Якщо це вдосконалення до іншої відповіді - як це виглядає так, молодець! - Ви можете надіслати це як редагування цієї відповіді :)
bertieb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.