Cat/Xargs/команда VS для/bash/command
На странице 38 книги Linux 101 Hacks предлагается:
cat url-list.txt | xargs wget –c
Я обычно делаю:
for i in `cat url-list.txt`
do
wget -c $i
done
Есть ли какая-то вещь, кроме длины, где техника xargs превосходит старый метод good for-loop в bash?
Добавлен
Исходный код в формате HTML, похоже, имеет только одну вилку. Напротив, , сколько вилок имеет bash -combo?. Пожалуйста, уточните проблему.
Ответы
Ответ 1
Из раздела Обоснование справочной страницы UNIX для xargs
. (Интересно, что этот раздел не отображается в версии OS X BSD xargs
, а также в версии GNU.)
Классическое приложение xargs Утилита связана с найти полезность для уменьшения количества процессы, запущенные путем упрощенного использования комбинации find -exec. Утилита xargs также используется для обеспечения соблюдения верхний предел памяти, необходимый для запустить процесс. С этой основой в ум, этот объем POSIX.1-2008 выбраны только минимальные возможности требуется.
В ходе последующей проверки вы спрашиваете, сколько вилок будет иметь другая версия. Джим уже ответил на это: один за итерацию. Сколько итераций есть? Невозможно дать точное число, но легко ответить на общий вопрос. Сколько строк в вашем файле url-list.txt?
Есть и другие соображения. xargs
требует особого внимания для имен файлов с пробелами или другими символами no-no, а -exec
имеет опцию (+
), которая группирует группы в партии. Поэтому не все предпочитают xargs
, и, возможно, это не подходит для всех ситуаций.
Смотрите эти ссылки:
Ответ 2
xargs
предназначен для обработки нескольких входов для каждого процесса, который он вилки. Оболочка script с контуром for
по своим входам должна преобразовывать новый процесс для каждого входа. Избегая того, что накладные расходы для каждого процесса могут дать решению xargs
значительное повышение производительности.
Ответ 3
Также рассмотрим:
xargs -I'{}' wget -c '{}' < url-list.txt
но wget обеспечивает еще лучшее средство для этого:
wget -c -i url-list.txt
Что касается рассмотрения xargs против цикла, я предпочитаю xargs, когда значение и реализация относительно "просты" и "понятны", в противном случае я использую циклы.
Ответ 4
xargs также позволит вам иметь огромный список, что невозможно с версией "для", потому что оболочка использует ограниченные по длине строки.
Ответ 5
вместо GNU/Parallel я предпочитаю использовать встроенную параллельную обработку xargs. Добавьте -P, чтобы указать, сколько вилок должно выполняться параллельно. Как в...
seq 1 10 | xargs -n 1 -P 3 echo
будет использовать 3 вилки на 3 разных ядрах для вычисления. Это поддерживается современными GNU Xargs. При использовании BSD или Solaris вам придется проверять себя.
Ответ 6
В зависимости от вашего интернет-соединения вы можете использовать GNU Parallel http://www.gnu.org/software/parallel/, чтобы запустить его параллельно.
cat url-list.txt | parallel wget -c
Ответ 7
Одно из преимуществ, которое я могу придумать, состоит в том, что если у вас много файлов, это может быть немного быстрее, поскольку у вас не так много накладных расходов при запуске новых процессов.
Я действительно не эксперт bash, поэтому могут быть другие причины лучше (или хуже).