`tar` медленная работа через` xargs` - PullRequest
2 голосов
/ 31 января 2012

Пожалуйста, рассмотрите этот фрагмент:

tar -Oxvf archive.tgz | grep something

или это:

tar tf archive.tgz > /tmp/x && tar -Oxvf archive.tgz -T /tmp/x | grep something

против этого:

tar tf archive.tgz | xargs -I{} tar -Oxvf archive.tgz {} | grep something

Первые два фрагмента очень быстры и похожи, в то время как третий примерно в 40 раз медленнее (я думаю, этот индекс относительно содержимого архива).Почему это?

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Ключом здесь является использование -I{} в xargs. На странице руководства написано:

   -I replace-str

Замена вхождений replace-str в исходных аргументах именами, считанными из стандартного ввода. Кроме того, пробелы без кавычек не завершить ввод элементов; вместо этого разделителем является символ перевода строки. подразумевает -x и -L 1 .

Подразумеваемый -L 1 заставляет xargs запускать tar -Oxvf archive.tgz {} один раз для каждого файла в архиве, а не запускать tar один раз для извлечения всех файлов, перечисленных в стандартном xargs 'stdin.

Упрощенный пример разницы:

$ (echo foo; echo bar)|xargs -I{} echo {}
foo
bar

$ (echo foo; echo bar)|xargs echo 
foo bar

Исправлено:

tar tf archive.tgz | xargs tar -Oxvf archive.tgz | grep something

Обратите внимание, однако, что результат этого будет не таким, как вы используете xargs -I{}, если имена файлов, заданные xargs, не в порядке файлов tar (то есть в том же порядке, в котором tar t перечисляет их в ). Версия xargs -I{} будет выводить файлы в порядке, указанном вами для xargs, тогда как эта версия будет выводить их в порядке файлов tar.

1 голос
/ 01 февраля 2012

Я несколько сомневаюсь, чего вы хотите достичь на своих примерах. Я не понимаю, чего должен достичь первый канал в первом примере, так как вывод, который передается по трубопроводу во второй tar, не используется. && может показаться лучшим способом объединить обе команды (выполнить вторую, только если первая была успешной). Кроме того, если вы используете полный список файлов для извлечения (и только для этой задачи), как в ваших примерах, не будет необходимости тратить отдельный запуск tar на его создание, так как tar по умолчанию будет распакуйте все файлы, если не указано иное.

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

Если вы ищете быстрый способ извлечь только подмножество файлов из архива tar и хотите выбрать по имени файла, я бы рекомендовал использовать star , который имеет встроенную команду поиска .

...