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