anonymous@RULINUX.NET~# Last login: 2024-11-05 13:19:15
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

bash построчное чтение файла

После потери музыкальной коллекции, пришлось обходиться мини-коллекции в vk.com
Но захотелось скачать.
С помощью MusicSig я получил список музыки в таком виде:


#EXTM3U
#EXTINF:179,Ashes Remain - Change My Life
http://cs5042.vk.me/u679124/audios/f2c127f5d886.mp3
#EXTINF:171,Ashes Remain - Right Here
http://cs4691.vk.me/u16643/audios/ff86abc22d6d.mp3
#EXTINF:170,Ashes Remain - End of Me
http://cs4874.vk.me/u7197060/audios/d012470224f2.mp3

wget может скачать это, но с назвать типа f2c127f5d886.mp3

Вопрос: как правильно написать этот скрипт на Bash?
(Готовий скрипт с комментариями приветствуется)

anonymous(*) (2013-03-16 11:21:50)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22

[Ответить на это сообщение]
[#] [Добавить метку] [Редактировать] Ответ на: bash построчное чтение файла от anonymous 2013-03-16 11:21:50
avatar
Скрыть

Re:bash построчное чтение файла

Читаешь строку, начинающийся с #EXTINF, берёшь из неё что нужно для названия. Затем wget ссылка -O "название".

spaceivan(*)(2013-03-16 11:36:07)

Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0
[#] [Добавить метку] [Редактировать] Ответ на: bash построчное чтение файла от anonymous 2013-03-16 11:21:50
avatar
Скрыть

Re:bash построчное чтение файла

Копируешь текст в файл, ищещь в инете инфу о редакторе sed. Делаешь вывод в stdout только строк с "http" потом wget или lftp.

anonymous(*)(2013-03-16 11:42:09)
Отредактировано anonymous по причине "не указана"
Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0
[#] [Добавить метку] [Редактировать] Ответ на: bash построчное чтение файла от anonymous 2013-03-16 11:21:50
avatar
Скрыть

Re:bash построчное чтение файла

# печать строк совпадающих с регулярным выражением (эмуляция grep)  sed -n '/regexp/p'           # вариант 1  sed '/regexp/!d'             # вариант 2
Вот к примеру. Написать весь костыль нету времени.

anonymous(*)(2013-03-16 11:49:05)
Отредактировано anonymous по причине "не указана"
Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0
[#] [Добавить метку] [Редактировать] Ответ на: Re:bash построчное чтение файла от anonymous 2013-03-16 11:42:09
avatar
Скрыть

Re:bash построчное чтение файла

А лучше на питоне замутить строчек 9-10 от силы будет.

Ax-Xa-Xa(*)(2013-03-16 12:03:18)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22
[#] [Добавить метку] [Редактировать] Ответ на: bash построчное чтение файла от anonymous 2013-03-16 11:21:50
avatar
Скрыть

Re:bash построчное чтение файла

не выебывайся слушай музычку вкоташле как все - онлайн.

\ ув. тов. м-р

anonymous(*)(2013-03-16 12:41:17)

Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0
[#] [Добавить метку] [Редактировать] Ответ на: bash построчное чтение файла от anonymous 2013-03-16 11:21:50
avatar
Скрыть

Re:bash построчное чтение файла

sed -n '/http/p' 1.txt > 2.txt
, где 1.txt - исходный материал, 2.txt - место сохранения ссылок.
Осталось только скачать используя ссылки из 2.txt
wget -i /путь/2.txt

Кстати, у меня выдает 404, при попытке скачать файлы. Видать сесия по ip или окончилось время. Чтобы еще автоматом заполнить теги, уже придется повозится.

anonymous(*)(2013-03-16 15:14:31)
Отредактировано anonymous по причине Затупил и не увидел, что требуется переименовывать файлы.
Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0
[#] [Добавить метку] [Редактировать] Ответ на: bash построчное чтение файла от anonymous 2013-03-16 11:21:50
avatar
Скрыть

Re:bash построчное чтение файла

text
#! /bin/awk -f

#  Running examples (simple.awk is name of this script):
#
#  ./simple.awk sample.txt
#  ./simple.awk -v debug=1 sample.txt
#  ./simple.awk -v path='~/Media/' sample.txt
#  ./simple.awk -v debug=1 -v path='~/Media/' sample.txt

BEGIN {
        LDEBUG="";
        LPATH="";
        if(length(path)>0){
            LPATH=path;
        }
        if(length(debug)>0){
            LDEBUG=debug;
        }
        extinf="";
}

/^#EXTINF:[0-9]+,.+$/{
  gsub(/[ tnr]+$/,""); # remove trailing non-printable chars from $0
  match($0,/^#EXTINF:([0-9]+),(.+)[[:space:]]*$/,ar);
  extinf = """ ar[1] "." ar[2] ".mp3"";
  if(LPATH)  extinf = LPATH extinf;
  if(LDEBUG) print extinf;
}

/^http://.+.mp3[ nrt]*$/{
  if(extinf){
    gsub(/[ tnr]+$/,""); # remove trailing non-printable chars from $0
    cmd="wget -O "extinf" '"$0"'";
    if(LDEBUG) print cmd;
    else system(cmd);
    extinf="";
  }
}
 


P.S.
Нет! Не пользуйся тем что выше - движок сожрал обратные слеши! Вот выложил на pastebin.com - там вроде нормально отображается.

P.P.S.
По дефолту, без "-v debug=1", оно будет пытаться качать. С "-v debug=1" просто отпечатает имена файлов и что будет запущено.

anonymous(*)(2013-03-16 15:22:35)
Отредактировано anonymous по причине Тюксоид, падла, не предусмотрел хайлайтер для awk :)
[#] [Добавить метку] [Редактировать] Ответ на: Re:bash построчное чтение файла от anonymous 2013-03-16 15:22:35
avatar
Скрыть

Re:bash построчное чтение файла

дописал бы еще чтоб теги заполнял.

anonymous(*)(2013-03-16 15:41:35)

Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0
[#] [Добавить метку] [Редактировать] Ответ на: Re:bash построчное чтение файла от anonymous 2013-03-16 15:41:35
avatar
Скрыть

Re:bash построчное чтение файла

Я про теги ничего не знаю

anonymous(*)(2013-03-16 15:45:03)

[#] [Добавить метку] [Редактировать] Ответ на: Re:bash построчное чтение файла от anonymous 2013-03-16 15:45:03
avatar
Скрыть

Re:bash построчное чтение файла

Добавил экранирование двойных кавычек на случай если встретятся в названии песни: http://pastebin.com/PaTuTkhz

anonymous(*)(2013-03-16 16:01:15)

[#] [Добавить метку] [Редактировать] Ответ на: Re:bash построчное чтение файла от Ax-Xa-Xa 2013-03-16 12:03:18
avatar
Скрыть

Re:bash построчное чтение файла

>А лучше на питоне замутить строчек 9-10 от силы будет.
Неспортивно!


#!/usr/bin/guile
-e main -s

!#
(use-modules (ice-9 getopt-long)
             (ice-9 rw)
             (ice-9 regex)
             (ice-9 popen)
             (ice-9 format))


(define file-regexp (make-regexp "#EXTINF:([0-9]+),([^n]+)[n ]+(http:[^n]+)"))


(define (file-contents file)
  (call-with-input-file file
    (lambda (p)
      (let* ((size (stat:size (stat p)))
             (buf (make-string size)))
        (read-string!/partial buf p)
        buf))))


(define (get-files file path debug)
  (define (download match count)
    (let* ((num (string-trim-both (match:substring match 1)))
           (fname (string-trim-both (match:substring match 2)))
           (url (string-trim-both (match:substring match 3)))
           (ext (car (reverse (string-split url #.))))
           (esc (regexp-substitute/global #f """ fname 'pre "\"" 'post))
           (fpath (format #f ""~a~a.~a.~a"" path num esc ext))
           (cmd (format #f "wget "~a" -O ~a || rm -f ~a" url fpath fpath)))
      (if debug
          (format #t "~a~%" cmd)
          (system cmd))
      (1+ count)))
  (format #t
          "Downloaded ~a files~%"
          (fold-matches file-regexp (file-contents file) 0 download)))


(define (main args)
  (let* ((option-spec '((debug (single-char #d) (value #f))
                        (file (single-char #f) (value #t))
                        (path (single-char #p) (value #t))
                        (help (single-char #h) (value #f))))
         (options (getopt-long args option-spec))
         (show-help (option-ref options '
help #f))
         (file (option-ref options 'file #f))
         (debug (option-ref options '
debug #f))
         (path (option-ref options 'path "")))
    (if (or show-help (not file))
        (format #t "
Usage: [options]
t-p|--pathtDownload directory (default: "")
t-d|--debugtDebug
t-h|--helpt
t-f|--filetData file~%")
        (get-files file path debug))))


UPD: и правда, жрёт слеши, ненасытный! Вот, если вдруг надо.

SystemV(*)(2013-03-18 02:03:27)
Отредактировано SystemV по причине "не указана"
Emacs-w3m/1.4.513 w3m/0.5.3
[#] [Добавить метку] [Редактировать] Ответ на: Re:bash построчное чтение файла от SystemV 2013-03-18 02:03:27
avatar
Скрыть

Re:bash построчное чтение файла

Охбле... Ты наверное ещё сутра начал ЭТО писать %)

anonymous(*)(2013-03-18 02:17:37)

[#] [Добавить метку] [Редактировать] Ответ на: Re:bash построчное чтение файла от anonymous 2013-03-18 02:17:37
avatar
Скрыть

Re:bash построчное чтение файла

>Охбле... Ты наверное ещё сутра начал ЭТО писать %)
На самом деле я просто уже писал что-то похожее для youtube-dl и списка файлов, как раз на guile. Хотелось на эту штуку посмотреть. Поэтому тут всё вышло довольно быстро и легко.

SystemV(*)(2013-03-18 02:21:33)

Emacs-w3m/1.4.513 w3m/0.5.3
[#] [Добавить метку] [Редактировать] Ответ на: Re:bash построчное чтение файла от SystemV 2013-03-18 02:03:27
avatar
Скрыть

Re:bash построчное чтение файла

o_0

Чем выбран сей язык ? Качаешь скилы для емакс лиспа ?

anonymous(*)(2013-03-18 02:25:57)

Mozilla/5.0 (Linux x86_64) AppleWebKit/537.6+ (KHTML, like Gecko) WebKitGTK+/1.10.2 luakit/0d5f4
[#] [Добавить метку] [Редактировать] Ответ на: Re:bash построчное чтение файла от anonymous 2013-03-18 02:25:57
avatar
Скрыть

Re:bash построчное чтение файла

>Чем выбран сей язык ? Качаешь скилы для емакс лиспа ?
Я, в своё время, сдуру частично прочитал SICP, и, видимо, заразился. Теперь тянет к этой скобочной функциональщине.

ЛNСП. (СОЙДУТ (ВСЕХ ПРОЧNТАВШNХ) (С УМА))

SystemV(*)(2013-03-18 02:28:37)

Emacs-w3m/1.4.513 w3m/0.5.3
[#] [Добавить метку] [Редактировать] Ответ на: Re:bash построчное чтение файла от SystemV 2013-03-18 02:03:27
avatar
Скрыть

Re:bash построчное чтение файла

>> А лучше на питоне замутить строчек 9-10 от силы будет.
> Неспортивно!
А выносить мозги анончикам спортивно?)))

python
#!/usr/bin/env python
import os
import os.path
import argparse

parser = argparse.ArgumentParser(description='M3U loader.')
parser.add_argument('file', help='m3u file list')
parser.add_argument('--path', help='download directory path', default='.')
args = parser.parse_args()
with open(args.file) as m3u:
    for line in m3u:
        if '#EXTINF' in line:
            try:
                artist, song = line.replace('n','')[line.index(',')+1:].split(' - ')
                path = args.path + os.path.sep + artist
                if not os.path.exists(path):
                    os.mkdir(path)
                os.system('wget -O "{0}{1}{2}.mp3" {3}'.format(path, os.path.sep, song, m3u.next()))
            except:
                print 'Wrong file format.'; break
 

Ax-Xa-Xa(*)(2013-03-18 11:20:26)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22
[#] [Добавить метку] [Редактировать] Ответ на: Re:bash построчное чтение файла от Ax-Xa-Xa 2013-03-18 11:20:26
avatar
Скрыть

Re:bash построчное чтение файла

Посчитал строчки - получилось больше чем 9-10. Но вообще хотя бы читабельно выглядит.

anonymous(*)(2013-03-18 15:37:30)

[#] [Добавить метку] [Редактировать] Ответ на: Re:bash построчное чтение файла от anonymous 2013-03-18 15:37:30
avatar
Скрыть

Re:bash построчное чтение файла

> Посчитал строчки - получилось больше чем 9-10.


Просто я повёлся на предложный Сисмемом разбор строки и сортировку по каталогам по имени исполнителя и названию. И тоже сделал это. А так бы было всего восемь)))

python
#!/usr/bin/env python
import os, sys
with open(sys.args[1]) as m3u:
        for line in m3u
                if '#EXTINF' in line]:
                        dest = [line.replace('n','')[line.index(',')+1:]
                        os.system('wget -O "{0}.mp3" {1}'.format(dest, m3u.next()))
 

Ax-Xa-Xa(*)(2013-03-18 16:54:45)
Отредактировано Ax-Xa-Xa по причине Ох бле какой досадный баг, нет все таки не шесть а восемь)))
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22
[#] [Добавить метку] [Редактировать] Ответ на: Re:bash построчное чтение файла от Ax-Xa-Xa 2013-03-18 16:54:45
avatar
Скрыть

Re:bash построчное чтение файла

> Ох бле какой досадный баг, нет все таки не шесть а восемь)))

Я вижу семь %)

anonymous(*)(2013-03-18 17:05:20)

[#] [Добавить метку] [Редактировать] Ответ на: Re:bash построчное чтение файла от Ax-Xa-Xa 2013-03-18 16:54:45
avatar
Скрыть

Re:bash построчное чтение файла

Добрый день. Здесь проходит конкурс на самый короткий питон-скрипт?

python
#!/usr/bin/python
import re, sys, subprocess as sp
with open(sys.argv[1], 'r') as f: list(map(lambda m: sp.call(['wget', m[2], '-O', '{}.{}.{}'.format(m[0], m[1], m[2].split('.')[-1])]), re.findall(r'#EXTINF:([0-9]+),([^n]+)[n ]+(http:[^n]+)', f.read())))
 

SystemV(*)(2013-03-18 17:44:44)

Emacs-w3m/1.4.513 w3m/0.5.3
[#] [Добавить метку] [Редактировать] Ответ на: Re:bash построчное чтение файла от SystemV 2013-03-18 17:44:44
avatar
Скрыть

Re:bash построчное чтение файла

> Здесь проходит конкурс на самый короткий питон-скрипт?
Да, но и на читаемый)))

Ax-Xa-Xa(*)(2013-03-18 17:59:04)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22
[#] [Добавить метку] [Редактировать] Ответ на: Re:bash построчное чтение файла от Ax-Xa-Xa 2013-03-18 17:59:04
avatar
Скрыть

Re:bash построчное чтение файла

>Да, но и на читаемый)))
Ну читаемость - штука субъективная:)

SystemV(*)(2013-03-18 18:23:42)

Emacs-w3m/1.4.513 w3m/0.5.3
Этот тред читают 3 пользователя:
Анонимных: 3
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!