Как загрузить URL-адреса в формате CSV и именования на основе значения столбца - PullRequest
0 голосов
/ 20 февраля 2019

1.ОС: Linux / Ubuntu x86 / x64

2.Задача:

Написать сценарий оболочки Bash для загрузки URL-адресов в (большой) CSV-файл (максимально быстрый / одновременный) и присвоить каждому выводу значение столбца.

2.1 Пример ввода:

CSV-файл, содержащий такие строки, как:

001,http://farm6.staticflickr.com/5342/a.jpg
002,http://farm8.staticflickr.com/7413/b.jpg
003,http://farm4.staticflickr.com/3742/c.jpg

2.2 Пример выходных данных:

Файлы в папке, outputs, с такими файлами, как:

001.jpg
002.jpg
003.jpg

3.Моя попытка:

Я пробовал в основном в двух стилях.

1.Используя внутреннюю поддержку инструмента загрузки

. Например, ariasc, он поддерживает опцию -i для импорта файла URL для загрузки, и (я думаю) будет обрабатывать его параллельно с максимальной скоростью.,У него есть опция --force-sequential для принудительной загрузки в порядке строк, но мне не удалось найти способ заставить часть именования.

2.Разделение сначала

, разделение файла на файлы и запуск сценария, подобного следующему, для его обработки:

#!/bin/bash
INPUT=$1

while IFS=, read serino url
do 
    aria2c -c "$url" --dir=outputs --out="$serino.jpg"
done < "$INPUT"

Однако это означает, что для каждой строки он будет перезапускать aria2c снова, что кажется затратнымвремя и низкая скорость.Хотя можно выполнить сценарий в команде bash несколько раз, чтобы получить параллелизм на уровне оболочки, но это не самый лучший способ.

Есть предложения?Спасибо,

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

aria2c поддерживает так называемые строки параметров во входных файлах.С man aria2c

-i, --input-file =
Загружает URI, указанные в ФАЙЛЕ.Вы можете указать несколько источников для одного объекта, поместив несколько URI в одну строку, разделенных символом TAB.Кроме того, параметры могут быть указаны после каждой строки URI .Строки параметров должны начинаться с одного или нескольких символов пробела (SPACE или TAB) и содержать только один параметр в строке.

и более поздних версий

Эти параметры имеют в точностито же значение, что и в параметрах командной строки, , но это относится только к URI, к которым он принадлежит .Обратите внимание, что для параметров во входном файле - префикс должен быть удален.

Вы можете конвертировать ваш CSV-файл во aria2c входной файл:

sed -E 's/([^,]*),(.*)/\2\n  out=\1/' file.csv | aria2c -i - 

Это преобразуетфайл в следующем формате и запустите на нем aria2c.

http://farm6.staticflickr.com/5342/a.jpg
  out=001
http://farm8.staticflickr.com/7413/b.jpg
  out=002
http://farm4.staticflickr.com/3742/c.jpg
  out=003

Однако это не приведет к созданию файлов 001.jpg, 002.jpg,… но 001, 002,…, посколькуэто то, что вы указали.Либо укажите имена файлов с расширениями, либо угадывайте расширения из URL.

Если расширение всегда jpg, вы можете использовать

sed -E 's/([^,]*),(.*)/\2\n  out=\1.jpg/' file.csv | aria2c -i -

. Чтобы извлечь расширения из URL, используйте

* 1042.*

Предупреждение: это работает тогда и только тогда, когда каждый URL заканчивается расширением.Например, из-за отсутствующего расширения строка 001,domain.tld/abc не будет преобразована вообще, что приведет к сбою aria2c в URL-адресе 001,domain.tld/abc.

0 голосов
/ 20 февраля 2019

Используя все стандартные утилиты, вы можете сделать это для параллельной загрузки:

tr '\n' ',' < file.csv |
xargs -P 0 -d , -n 2 bash -c 'curl -s "$2" -o "$1.jpg"' -

-P 0 опция в xargs позволяет запускать команды параллельно (по одной на процессор ядра)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...