2009-08-15 7 views
4

На странице 38 книги Linux 101 Хаки наводит на мысль:кошки/Xargs/команда VS для/Баша/команд

cat url-list.txt | xargs wget –c 

Я обычно делаю:

for i in `cat url-list.txt` 
    do 
     wget -c $i 
    done 

Есть некоторые вещи, кроме длина, где xargs-техника превосходит старую технику хороших для петли в bash?

Добавлено

C source code, кажется, есть только одна вилка. Напротив, сколько вилок имеет bash-combo? Пожалуйста, уточните проблему.

ответ

4

В разделе Обоснование a UNIX manpage for xargs. (Интересно, этот раздел не отображается в версии OS X BSD из xargs, ни в версии GNU.)

Классическое применение в xargs утилита находится в сочетании с утилитой найти, чтобы уменьшить число из процессов, запущенных упрощенным использованием комбинации find -exec. Утилита xargs также используется для обеспечения соблюдения верхнего предела в памяти, необходимого для , запускающего процесс. С этой основой в умом этот объем POSIX.1-2008 был выбран только с минимальными функциями .

В ходе последующей проверки вы спрашиваете, сколько вилок будет иметь другая версия. Jim already answered this: один за итерацию. Сколько итераций есть? Невозможно дать точное число, но легко ответить на общий вопрос. Сколько строк в вашем файле url-list.txt?

Есть и другие соображения. xargs требует дополнительного ухода за имена файлов с пробелами или другими не-без символов, и -exec имеет возможность (+), что группы обработки в пакетном режиме. Таким образом, не все предпочитают xargs, и, возможно, это не подходит для всех ситуаций.

Смотрите эти ссылки:

0

Одним из преимуществ я могу думать о том, что, если у вас есть много файлов, это может быть немного быстрее, так как вы не имеете, как много накладных расходов от запуска новых процессов.

Я на самом деле не эксперт Баш, хотя, так что может быть и другие причины, это лучше (или хуже).

4

xargs предназначен для обработки нескольких входов для каждого процесса него вилки. Сценарий оболочки с циклом for над его входами должен вызывать новый процесс для каждого входа. Избегая того, что накладные расходы для каждого процесса могут дать решение xargs существенное повышение производительности.

+1

Вы имеете в виду, что xargs предназначен только для производительности? Сложно поверить. Должно быть что-то еще с этим. –

+0

Это также несколько короче, чем тип. И имеет большой ярлык, который говорит «не паникуйте» – kdgregory

+2

И быть серьезным: создание процесса не очень дешево. С сегодняшними быстрыми процессорами это не заметно, но вернуться через 10-15 лет, и вы можете понять, почему xargs является предпочтительным решением. – kdgregory

4

считают также:

xargs -I'{}' wget -c '{}' < url-list.txt 

но Wget обеспечивает еще лучшее средство для того же:

wget -c -i url-list.txt 

Что касается рассмотрения xargs против цикла, я предпочитаю xargs, когда значение и реализация относительно «просты» и «понятны», в противном случае я использую циклы.

4

xargs также позволит вам иметь огромный список, что невозможно для версии «для», поскольку оболочка использует ограниченные по длине строки.

+0

Это одна из единственных убедительных причин, по которой я стаду, принимая ее правильную и не устаревшую информацию. – ThorSummoner

1

В зависимости от вашего интернет-соединения вы можете использовать GNU Parallel http://www.gnu.org/software/parallel/ для параллельной работы.

cat url-list.txt | parallel wget -c 
2

вместо GNU/Parallel Я предпочитаю использовать встроенную параллельную обработку xargs. Добавьте -P, чтобы указать, сколько вилок должно выполняться параллельно. Как в ...

seq 1 10 | xargs -n 1 -P 3 echo 

будет использовать 3 вилки на 3 различных ядрах для вычисления. Это поддерживается современными GNU Xargs. При использовании BSD или Solaris вам нужно будет убедиться.

Смежные вопросы