Как сделать файл поддержки скрипта:/// нотация?

Когда я копирую любой файл и вставляю его в консоль или текстовое редактирование, он передается как

Файл:/// дом / пользователь / путь / файл

когда я передаю его в сценарий, он не найден

Какой самый простой способ преобразовать это в обычный путь Linux или каким-то образом заставить скрипт поддерживать его?

например

файл cat:///home/user/path/file

говорит

Данный файл или каталог отсутствует

5 ответов

Решение

Удалить file:// Префикс из URL, вы можете использовать sed:

echo "file:///home/user/path/file" | sed "s/^file:\/\///g"

Что выше делает:

  • Отображает URL для стандартного вывода (так что его можно изменить с помощью sed)
  • Заменяет все вхождения file:// в любой строке, которая начинается с file:// ни с чем. Это эффективно удаляет file:// из URL оставив только /home/user/path/file

Чтобы использовать это из скрипта, вы можете попробовать следующее:

cat $(echo "file:///home/user/path/file" | sed "s/^file:\/\///g")

Теперь сообщение об ошибке:

cat: /home/user/path/file: No such file or directory

(Обратите внимание, что это относится к правильному имени файла вместо URL.)

Было бы намного чище хранить преобразованное имя файла в переменной оболочки и использовать его впоследствии.

MYFILE=$(echo "file:///home/user/path/file" | sed "s/^file:\/\///g")
cat $MYFILE

Я не знаю ни одной команды, которая конвертирует между URL-адресами файлов и путями к файлам, но вы можете конвертировать с помощью python или любого другого языка с привязками к gio. Например:

$ python -c 'import gio,sys; print(gio.File(sys.argv[1]).get_path())' file:///home/user/path/file%20with%20spaces
/home/user/path/file with spaces

Вы также можете использовать urlencode (sudo apt-get gridsite-clients):

$ echo "$(urlencode -d "file:///folder/with%20spaces")"
file:///folder/with spaces
$ echo "$(urlencode -d "file:///folder/with%20spaces"|cut -c 8-)"
/folder/with spaces

Если вам не нужна шестнадцатеричная поддержка, вы можете просто использовать cut -c 8-, Кроме того, вы можете использовать urlencode с любым другим методом удаления file:// (sed, расширение скобок и т. д.)

Я считаю, что вы можете сделать это сам Bash. Попробуйте следующее

echo "file:///home/user/path/file" | cut -d'/' -f3-
/home/user/path/file

Он будет разделять до файла:// а остальное будет отражено на терминале.

Вы можете использовать это, предполагая, file_path содержит путь:

#!/bin/bash

file_path='file:///home/me/Desktop/path test'

file_path="${file_path#file://}"

echo "${file_path}"

какие отпечатки /home/me/Desktop/path test, Это позволяет ему работать с или без file://, используя только манипуляции строк Bash.


Вы можете добавить это к функции (в .bashrc) для удобства использования:

Функция:

norm_path() {
    echo "${@#file://}"
}

Использование:

cat "$(norm_path file:///home/user/path/file)"
Другие вопросы по тегам