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, поэтому могут быть и другие причины, по которым это лучше (или хуже).

Другие вопросы по тегам