Как сделать файл поддержки скрипта:/// нотация?
Когда я копирую любой файл и вставляю его в консоль или текстовое редактирование, он передается как
Файл:/// дом / пользователь / путь / файл
когда я передаю его в сценарий, он не найден
Какой самый простой способ преобразовать это в обычный путь 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)"