Deniz 10.02.2011 00:40

Есть вопрос!скрипт для .url файлов

Хочу вот открывать .url файлы (которые из под windows) в Убунте.
Внутри они выглядят как-то так:
1
2
<internetshortcut>
URL=http://pixeldigest.ru/reviews/3d-pixel-art/</internetshortcut>


Но, не нашёл я ничего готового в гугле. Всё что смог придумать, это вот:
1
2
3
#!/bin/bash
grep -m 1 -o -P 'http://(\w+|\W+|\d+)+' %U | while read i; do gnome-open "$i";
done


Как мне казалось в переменную %U должен подставляться путь до файла, но:
1
grep: %U: Нет такого файла или каталога


Если же запустить непосредственно в терминале:
1
2
3
#!/bin/bash
grep -m 1 -o -P 'http://(\w+|\W+|\d+)+' 'путь_к_файлу.url' | while read i; do gnome-open "$i";
done

То ссыль открывается ... и ещё открывается окно Наутилуса. Наверно потому-что grep выдаёт ещё пустую строку.

Подкиньте умных решений пжалста :)


Тэги: bash url скрипт
+ 0 -
Похожие Поделиться

_DM_ 10.02.2011 00:55 #
firefox http://localhost/
Пробовали?
Deniz 10.02.2011 01:00 #
попробовал ) Открылся мой хоумпэйдж. it Works !!!
zz 10.02.2011 01:02 #
Все, что идет после имени программы - это параметры (ключи). Например, в
cat filename
cat - имя программы, filename - передаваемый программе параметр. В bash-скриптах передаваемые параметры видны как $n, где n - порядковый номер параметра в строке запуска скрипта (т.е. $1, $2, $3 и т.д.). Что бы увидеть как это работает, создайте файл test с таким содержанием:
#!/bin/bash
echo $1
Добавьте файлу права для исполнения и запустите его:
$ ./test
В ответы вы ничего не получите. Но если запустить так:
$ ./test text
text
вы получите в ответ текст, который вы ввели в качестве первого параметра. Стоит заметить, что если передать скрипту параметр some text, то это уже будет считаться двумя параметрами. для того, что бы скрипт воспринял это как один параметр, стоит заключить этот текст в кавычки.

В вашем случае, для того, что бы в скрипте был виден путь к файлу, который передается в качестве параметра, стоит заменить %U в параметрах grep на "$1".

Старайтесь обрамлять все переменные в двойные кавычки.
Вам будет полезно изучить и использовать в качестве справочника данное руководство по интерпретатору bash.
Deniz 10.02.2011 01:10 #
Спасибо, теперь пожалуй разберусь как допилить.
kstep 10.02.2011 02:29 #
Вставлю свои 5 копеек. Надо бы цикл while read i...done на xargs. Если объединить с советом zz, то скрипт должен выглядеть примерно так:

#!/bin/sh
grep -m 1 -o -P 'http://(\w+|\W+|\d+)+' "$1" | xargs gnome-open
zz 10.02.2011 02:56 #
ну да, while тут явно не нужен. к тому же и grep не все ссылки будет открывать распознавать. например, https уже он не покажет. я на остальную часть тогда не обратил внимания, т.к. меня %U умилило)) интересно, что это вообще должно значить и где подсмотрено (с знака % в вендах вроде бы переменные начинаются)
cppmm 10.02.2011 08:02 #
https уже он не покажет.

Ага, поэтому вместо хитрого регекспа я бы сделал простенький конвеер. Тогда можно ловить любые ссылки на любые протоколы. Что-то типа такого:
#!/bin/bash
grep -m1 URL "$1" | awk -F "URL=" '{print $2}' | xargs gnome-open
Deniz 10.02.2011 19:07 #
Ништяк, теперь вообще всё как надо работает !
kstep 10.02.2011 11:21 #
Насколько помню, это Наутилус туда имя файла подставляет, когда дропаешь файл на скрипт или actions запускаешь. Как-то так, я наутилус давно не пользую. Тут дело в том, что %U должно быть в строке для запуска скрипта, данной наутилусу, но никак не в самом скрипте.
Deniz 10.02.2011 18:56 #
%U было подсмотрено вот тут :)
gnome-terminal -e "wget -c --directory-prefix=Загрузки/dnd %U"
GalS 10.02.2011 13:48 #
Для информации An Unofficial Guide to the URL File Format

Мой быдлокод ниже
ini_parser()
{
if < $# -lt 2 >; then
echo "Usage: `basename $0` <Section Name> <Parameter> < File >"
exit 1
fi

local SNAME="$1"
local PNAME="$2"
if < -f $3 >; then
local FILE="$3"
else
local FILE="-"
fi


local SP='<<:blank:>>'
local SPS="${SP}*"
local CONVERT_CRLF="s/.$//"
local REMOVE_COMMENT="s/<;#>.*$//"
local LEFT_TRIM="s/^${SPS}//"
local RIGHT_TRIM="s/${SPS}$//"
local DEL_BLANK_LINES="/^${SPS}$/d"

local FILTER="${CONVERT_CRLF};${REMOVE_COMMENT};${LEFT_TRIM};${RIGHT_TRIM};${DEL_BLANK_LINES}"

local SECTION_NAME='.*'
local GET_SECTION="/^\<${SNAME}\>$/,/^\<${SECTION_NAME}\>$/!d"
local DEL_SECTION_NAMES="/^\<${SECTION_NAME}\>$/d"

local RUN="$FILTER;${GET_SECTION};${DEL_SECTION_NAMES};/^${PNAME}${SPS}=/!d;s/^${PNAME}${SPS}=${SPS}//"

sed "${RUN}" $FILE
}


Пример

ini_parser InternetShortcut URL | xargs gnome-open
Deniz 10.02.2011 19:14 #
Как я понял эту функцию надо в bashrc вставить ?
GalS 10.02.2011 19:38 #
да
kstep 10.02.2011 20:34 #
Тогда уже так:


#!/usr/bin/python
import sys
from ConfigParser import SafeConfigParser, NoSectionError, NoOptionError

try:
section = sys.argv<1>
param = sys.argv<2>

except IndexError:
print 'Usage: %s <section> <parameter> <<filename>>' % sys.argv<0>
sys.exit(1)

cp = SafeConfigParser()

try:
cp.read(sys.argv<3>)

except IndexError:
cp.readfp(sys.stdin)

try:
print cp.get(section, param)
except (NoSectionError, NoOptionError):
pass

Deniz 11.02.2011 15:10 #
Ну теперь осталось ещё переложить на C, и оформить в виде модуля ядра =)
kstep 11.02.2011 16:56 #
Я к тому, что в питоне уже есть готовый хорошо отлаженный модуль для парсинга ини-файлов, так что написание такого парсера на шеле выглядит немного велосипедно...
kstep 11.02.2011 17:00 #
Однострочником кстати тоже можно:


python -c 'import ConfigParser as cp; c=cp.SafeConfigParser();c.read("/path/to/file.ini");print c.get("section_name", "param_name")'
krserv 17.05.2014 18:56 #
подскажите пжс а где взять утилиту или готовый скрипт, чтобы можно было открывать URL файлы, я не знаю Bash, Linux хорошо, чтобы разобраться самостоятельно с этой информацией.Т.е у меня с Windows есть много файлов-ссылок в URL формате, и что теперь с ними делать, чтобы из Linux открывать можно было?
dront78 18.05.2014 16:08 #