Как заставить сценарий поддерживать нотацию file:///?

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

file:///home/user/path/file

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

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

например,

кошка file:///home/user/path/file

говорит

Никакой такой файл или каталог

5
задан 2 November 2011 в 16:57

5 ответов

Я не знаю ни о каких командах, которые преобразовывают между 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
6
ответ дан 2 November 2011 в 16:57

Вы можете использовать это, предполагая, что 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)"
0
ответ дан 2 November 2011 в 16:57

Вы также можете использовать 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, скобка и т. Д.)

0
ответ дан 2 November 2011 в 16:57

Чтобы удалить префикс 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
0
ответ дан 2 November 2011 в 16:57

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

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

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

0
ответ дан 2 November 2011 в 16:57

Другие вопросы по тегам:

Похожие вопросы: