cat/Xargs/command 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 превосходит старую хорошую методику for-loop в bash?
добавленной
Кажется, что исходный код C имеет только одну форк. Напротив, сколько вилок имеет bash-combo? Пожалуйста, уточните вопрос.
7 ответов
Из раздела "Обоснование" справочной страницы UNIX дляxargs
, (Интересно, что этот раздел не отображается в версии OS X BSD xargs
ни в версии GNU.)
Классическое применение утилиты xargs в сочетании с утилитой find позволяет сократить количество запускаемых процессов за счет упрощенного использования комбинации find -exec. Утилита xargs также используется для обеспечения верхнего предела памяти, необходимой для запуска процесса. Исходя из этого, в томе POSIX.1-2008 выбраны только минимальные требуемые функции.
В последующем вы спрашиваете, сколько вил будет иметь другая версия. Джим уже ответил на это: один за итерацию. Сколько существует итераций? Невозможно дать точное число, но легко ответить на общий вопрос. Сколько строк в вашем файле url-list.txt?
Есть и другие соображения. xargs
требует особого внимания к именам файлов с пробелами или другими символами "нет", и -exec
есть опция (+
), что группирует обработку в партии. Так что не все предпочитают xargs
и, возможно, это не лучше для всех ситуаций.
Смотрите эти ссылки:
xargs
предназначен для обработки нескольких входов для каждого процесса, который он разветвляет. Сценарий оболочки с for
зацикливание на своих входах должно форкировать новый процесс для каждого входа. Избавление от накладных расходов на процесс может дать xargs
Решение значительное повышение производительности.
xargs также позволит вам иметь огромный список, что невозможно с версией "for", потому что оболочка использует командные строки, ограниченные по длине.
Также учтите:
xargs -I'{}' wget -c '{}' < url-list.txt
но wget предоставляет еще лучшее средство для того же:
wget -c -i url-list.txt
Что касается рассмотрения xargs и цикла, я предпочитаю xargs, когда значение и реализация относительно "просты" и "понятны", в противном случае я использую циклы.
Вместо GNU/Parallel я предпочитаю использовать встроенную параллельную обработку xargs. Добавьте -P, чтобы указать, сколько форков нужно выполнять параллельно. Как в...
seq 1 10 | xargs -n 1 -P 3 echo
будет использовать 3 вилки на 3 разных ядрах для расчета. Это поддерживается современным GNU Xargs. Вы должны будете проверить сами, если используете BSD или Solaris.
В зависимости от вашего интернет-соединения вы можете использовать GNU Parallel http://www.gnu.org/software/parallel/ чтобы запустить его параллельно.
cat url-list.txt | parallel wget -c
Одно преимущество, которое я могу придумать, заключается в том, что, если у вас много файлов, это может быть немного быстрее, поскольку у вас не так много накладных расходов при запуске новых процессов.
Хотя я не эксперт в bash, поэтому могут быть и другие причины, по которым это лучше (или хуже).