Вопрос или проблема
Предположим, что на разделе Windows NTFS у нас есть файл .lnk
, указывающий на другой файл:
$ lnkinfo invoice.lnk | grep "Relative path"
Относительный путь : ..\..\dir1\dir2\invoice.pdf
Существует ли команда, скажем, lnk_to_linpath, которая извлекает и преобразует такой относительный путь Windows в относительный путь Linux? Цель состоит в том, чтобы в нашем примере
$ evince `lnk_to_linpath invoice.lnk` &
открыть связанный PDF-файл счета. (Если новый путь, кажется, не существует, используйте какую-то разумную стратегию, скажем, игнорируйте или отправьте сообщение об ошибке в stderr и верните ненулевой код.) Эта задача кажется настолько распространенной (связано: https://askubuntu.com/questions/762102/how-do-i-open-windows-shortcuts-lnk-files), что кто-то мог уже выполнить эту работу, и нам не нужно изобретать колесо заново.)
Похоже, вы можете просто использовать то, что у вас есть. Вы можете получить относительный путь с помощью (не тестировалось, так как у меня нет ни lnkinfo
, ни Windows на системе):
lnkinfo invoice.lnk | grep -oP 'Relative path\s*:\s*\K.*'
Флаг -o
указывает grep
печатать только совпадающую часть строки, а -P
включает PCRE (совместимые с Perl регулярные выражения), которые предоставляют нам \s
(пробельные символы) и \K
(забыть все, что совпало до этого). Таким образом, регулярное выражение ищет Relative path
, 0 или более пробельных символов (\s*
), затем :
и снова 0 или более пробельных символов. Затем \K
заставляет grep
игнорировать все совпадения на данный момент, так что он только напечатает остальную часть строки, то есть путь.
Основываясь на вводе, который вы показываете, это должно вернуть ..\..\dir1\dir2\invoice.pdf
. Таким образом, мы наполовину на правильном пути, нам просто нужно заменить \
на /
, что можно сделать с помощью tr '\\' '/'
.
Собрав всё это вместе, мы можем написать небольшую функцию:
lnk_to_linpath(){
lnkinfo "$1" | grep -oP 'Relative path\s*:\s*\K.*' | tr '\\' '/'
}
Добавьте эти строки в ваш ~/.bashrc
(или эквивалент, если не используете bash
), откройте новый терминал, и теперь вы сможете выполнить
evince `lnk_to_linpath invoice.lnk` &
Или, лучше, поскольку бэктики устарели:
evince "$(lnk_to_linpath invoice.lnk)" &
Ответ или решение
Конечно! Давайте разберем, как извлечь относительный путь из .lnk файла в Windows и преобразовать его в относительный путь, который будет работать в Linux.
Решение задачи
Чтобы решить эту задачу, мы можем написать функцию lnk_to_linpath
, которая будет извлекать относительный путь из .lnk файла с помощью команды lnkinfo
, а затем преобразовывать Windows-формат пути в Linux-формат.
-
Извлечение относительного пути: Мы будем использовать команду
lnkinfo
в сочетании сgrep
для извлечения относительного пути. -
Преобразование пути: Мы заменим обратные слэши
\
на обычные слэши/
, которые используются в Linux.
Пример реализации
Вот как можно реализовать функцию lnk_to_linpath
в вашем терминале Linux:
lnk_to_linpath(){
lnkinfo "$1" | grep -oP 'Relative path\s*:\s*\K.*' | tr '\\' '/'
}
Инструкция по использованию
-
Добавление функции в конфигурацию:
- Откройте файл
~/.bashrc
(или соответствующий файл конфигурации вашей оболочки) в текстовом редакторе. - Вставьте функцию, приведенную выше, в конец файла.
- Сохраните файл и закройте редактор.
- Откройте файл
-
Применение изменений:
- В терминале выполните команду, чтобы применить изменения:
source ~/.bashrc
- В терминале выполните команду, чтобы применить изменения:
-
Использование функции:
- После этого можно использовать функцию
lnk_to_linpath
для открытия файла. Например:evince "$(lnk_to_linpath invoice.lnk)" &
- После этого можно использовать функцию
Обработка ошибок
Чтобы добавить обработку ошибок в случае отсутствия файла или неправильного пути, мы можем немного изменить нашу функцию:
lnk_to_linpath(){
path=$(lnkinfo "$1" | grep -oP 'Relative path\s*:\s*\K.*' | tr '\\' '/')
if [ -e "$path" ]; then
echo "$path"
else
echo "Ошибка: файл не найден по указанному пути." >&2
return 1
fi
}
Заключение
Теперь вы можете легко извлекать относительные пути из Windows .lnk файлов и открывать связанные с ними PDF-файлы или другие файлы в Linux, просто вызвав lnk_to_linpath
. Убедитесь, что вы правильно установили утилиту lnkinfo
и используете корректные пути к файлам.