Назад | Перейти на главную страницу

Использовать номер загруженного файла в wget как переменную в сценарии bash

Могу ли я получить количество загруженных файлов с помощью wget -r и использовать это как переменную? Я хочу написать сценарий, который запускает в нем несколько команд wget (используя -q, чтобы я мог управлять выводом), а затем в конце складывать количество загруженных файлов и отображать это для пользователя. Это возможно?

Вы можете просто направить весь вывод в файл с -a флаг для отправки вывода в файл, затем выполните поиск в файле журнала и подсчитайте вхождения слова «сохранено»:

root@demo:tmp# wget -r http://www.google.com/index.html -a logfile
root@demo:tmp# grep saved logfile |wc -l
1

Чтобы развить предложение Джеда и довести его до конца, вы можете сделать что-то вроде этого:

MY_VARIABLE=$(wget -r http://foo 2>&1 | grep -c 'saved')

Или, если вы хотите сделать что-то более сложное, но более надежное и надежное, вы можете вытащить счетчик загрузок, указанный в виде сводки с помощью wget:

MY_VARIABLE=$(wget -r -nv http://foo 2>&1 | awk '/^Downloaded:/ {print $2}')

Обновить: Учитывая 2>&1 construct, для приложения * nix существует два потока вывода по умолчанию, stdout (дескриптор файла 1) и stderr (файловый дескриптор 2). Для интерактивных команд обе обычно отправляются на экран / терминал, поэтому их бывает сложно различить. В 2>&1 сообщает вашему bash, что нужно отправить вывод на stderr (fd 2) и объедините его с выводом для stdout (fd 1). Результатом является единственный выходной поток, который будет выглядеть для следующего инструмента в конвейере (как указано выше) так же, как выходные данные на вашем экране.

Это необходимо, потому что по умолчанию wget отправляет информацию о статусе в stderrне stdout. Если вы выполнили вышеуказанное без stderr перенаправление, вы отправляете stdout в программу по конвейеру, но это все. Вы получите весь вывод wget на свой экран (stderr), и переменная будет пустой, потому что grep или awk заявления обрабатываются stdout (который не получил выхода).

Чтобы увидеть, что куда отправляется для приложения, вы можете сделать что-то вроде этого:

wget -r -nv http://foo 2>foo.err 1>foo.out

Или просто:

wget -r -nv http://foo 2>foo.err >foo.out

Если вы не укажете номер для перенаправления вывода, по умолчанию он будет stdout.

Файлы foo.err и foo.out будет содержать содержимое всех ваших команд, заканчивающихся на stderr и stdoutсоответственно.

Также стоит отметить, что вы также можете использовать |& как ваша команда трубы для объединения stderr с участием stdout, как сокращение для 2>&1.

Для получения дополнительной информации о перенаправлении команд и stdin, stdout, и stderrсм. справочную страницу bash, справочные страницы stdin, stdout и stderr, а также по историческим причинам stdout и stderrсм. это сообщение: http://jstorimer.com/2011/12/29/the-difference-between-stdout-and-stderr.html