Как распечатать относительный путь Windows из файла .lnk в виде относительного пути Linux?

Вопрос или проблема

Предположим, что на разделе 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-формат.

  1. Извлечение относительного пути: Мы будем использовать команду lnkinfo в сочетании с grep для извлечения относительного пути.

  2. Преобразование пути: Мы заменим обратные слэши \ на обычные слэши /, которые используются в Linux.

Пример реализации

Вот как можно реализовать функцию lnk_to_linpath в вашем терминале Linux:

lnk_to_linpath(){
   lnkinfo "$1" | grep -oP 'Relative path\s*:\s*\K.*' | tr '\\' '/'
}

Инструкция по использованию

  1. Добавление функции в конфигурацию:

    • Откройте файл ~/.bashrc (или соответствующий файл конфигурации вашей оболочки) в текстовом редакторе.
    • Вставьте функцию, приведенную выше, в конец файла.
    • Сохраните файл и закройте редактор.
  2. Применение изменений:

    • В терминале выполните команду, чтобы применить изменения:
      source ~/.bashrc
  3. Использование функции:

    • После этого можно использовать функцию 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 и используете корректные пути к файлам.

Оцените материал
Добавить комментарий

Капча загружается...