Могу ли я получить количество загруженных файлов с помощью 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