назначить два bash массива одной командой - PullRequest
0 голосов
/ 21 апреля 2020

youtube-dl может занять некоторое время при разборе удаленных сайтов при многократном вызове.

EDIT0: я хочу получить вывод нескольких свойств (здесь fileNames и remoteFileSizes) по youtube-dl без необходимости запустить его несколько раз.

Я использую эти 2 свойства, чтобы сравнить локальный размер файла, и ${remoteFileSizes[$i]}, чтобы определить, завершил ли файл загрузку.

$ youtube-dl --restrict-filenames -o "%(title)s__%(format_id)s__%(id)s.%(ext)s" -f m4a,18,webm,251 -s -j https://www.youtube.com/watch?v=UnZbjvyzteo 2>errors_youtube-dl.log | jq -r ._filename,.filesize | paste - - > input_data.txt
$ cat input_data.txt
Alan_Jackson_-_I_Want_To_Stroll_Over_Heaven_With_You_Live__18__UnZbjvyzteo__youtube_com.mp4 8419513
Alan_Jackson_-_I_Want_To_Stroll_Over_Heaven_With_You_Live__250__UnZbjvyzteo__youtube_com.webm   1528955
Alan_Jackson_-_I_Want_To_Stroll_Over_Heaven_With_You_Live__140__UnZbjvyzteo__youtube_com.m4a    2797366
Alan_Jackson_-_I_Want_To_Stroll_Over_Heaven_With_You_Live__244__UnZbjvyzteo__youtube_com.webm   8171725

Мне нужен первый столбец в массив fileNames и второй столбец в remoteFileSizes.

В настоящее время я использую while read l oop, но когда этот l oop закончен, мои два массива потерян:

$ fileNames=()
$ remoteFileSizes=()
$ cat input_data.txt | while read fileName remoteFileSize; do \
    fileNames+=($fileName); \
    remoteFileSizes+=($remoteFileSize); \
done
$ for fileNames in "${fileNames[@]}"; do \
    echo PROCESSING....; \
done
$ echo "=> fileNames[0] = ${fileNames[0]}"
=> fileNames[0] = 
$ echo "=> remoteFileSizes[0] = ${remoteFileSizes[0]}"
=> remoteFileSizes[0] = 
$

Можно ли назначить два bash массива одной командой?

Ответы [ 2 ]

3 голосов
/ 22 апреля 2020

Вы присваиваете переменные в подоболочке, чтобы они не были видны в родительской оболочке. Читать https://mywiki.wooledge.org/BashFAQ/024. Удалите cat и выполните перенаправление для решения вашей проблемы.

while IFS=$'\t' read -r fileName remoteFileSize; do
    fileNames+=("$fileName")
    remoteFileSizes+=("$remoteFileSize")
done < input_data.txt

Вы также можете заинтересоваться https://mywiki.wooledge.org/BashFAQ/001.

2 голосов
/ 22 апреля 2020

Для чего стоит, если вы ищете специфическую / сделанную на заказ функциональность от youtube-dl, я рекомендую создавать свои собственные python сценарии с использованием «встроенного» подхода: https://github.com/ytdl-org/youtube-dl/blob/master/README.md#embedding -youtube-dl

Вы можете установить собственный сигнал о завершении загрузки (текст / перезвон / почта / что угодно) и отслеживать загрузки, не сравнивая размеры файлов.

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