Параллельный локоть с файлом ввода и вывода имени файла на оболочке Linux

642
kurokirasama

Я обычно скачиваю файлы параллельно с curl и urls в файл, подобный этому:

cat links.txt | parallel --will-cite curl --connect-timeout 5 --max-time 10 --retry-max-time 40 --retry 5 --retry-delay 0 -s -f -O -C - 

Где links.txt имеет один URL на строку.

Теперь мне нужно назначить пользовательское имя файла каждому файлу, и я не могу понять, как добавить этот второй вход в curlкорыто parallel. Среди прочего я пытался добавить -o filenameк каждой строке, links.txtно это не сработало.

С Уважением,

1
Покажите нам, как бы вы это сделали, если бы вам пришлось делать 3 «вручную» (т.е. без использования GNU Parallel). (И рассмотрите возможность запуска `parallel --bibtex` один раз). Ole Tange 6 лет назад 0
скопируйте и вставьте URL-адрес файла с таким именем: `curl --connect-timeout 5 - max-time 10 --retry-max-time 40 --retry 5 --retry-delay 0 -s -f -C - -o filename1 url1` kurokirasama 6 лет назад 0
Вы действительно хотите, чтобы все URL были сохранены в `filename1`? Ole Tange 6 лет назад 0
NOP. copy-paste означает `curl ... filename1 url1`,` curl ... filename2 url2 `и т. д. kurokirasama 6 лет назад 0

1 ответ на вопрос

1
PEdroArthur

Согласно man parallel, вы можете использовать некоторые заполнители, чтобы помочь вам. Например, вы можете переписать свой код на:

parallel curl "$" -o '{#}'.curl_output '{}' :::: links.txt 

где $все ваши аргументы curlи links.txtимеет один URL на строку. Этой командой вы извлекаете URL-адреса links.txtи сохраняете результат в файле, названном в соответствии с номером задания, чем запустите curl (например, 10.curl_output). Вам нужно будет сопоставить номер задания с URL-адресами.

Другим подходом будет позвонить curlс -o '{}'._curl_output. В этом случае вам придется иметь дело со специальными символами в URL ( /например,).

Помимо них, вы также можете разбить столбцы на, links.txtкоторый содержит URL и выходной файл на строку. Это позволит вам сделать

parallel --colsep " " curl "$" -o '' '' :::: links.txt 

В этом случае --colsepаргумент будет разделять строки на основе разделителя ( " "в данном случае).

Спасибо! Твой третий вариант был именно тем, что я искал. Тем не менее, другие варианты могут быть полезны в других ситуациях ... kurokirasama 6 лет назад 0

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