2012-01-31 2 views
2

Пожалуйста, обратите внимание этот фрагмент:`tar` низкой производительности через` xargs`

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

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

+0

Похоже, что при использовании переключателя '-T'' tar' считывает список и извлекает файлы за один проход под собственным правилом (так как он не извлекается в порядке, как в списке файлов '/ tmp/x', но чтобы они сжимались), тогда как при использовании 'xargs' штраф берется из последовательного выполнения. Даже если это окажется правдой, это слишком медленно IMHO – theta

ответ

1

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

-I replace-str 

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

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

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

$ (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-файла.

+0

ОК. Это, безусловно, правильный ответ на заданный вопрос, но я хочу прокомментировать это так: tar tf archive.tgz | сортировать | xargs tar -Oxvf archive.tgz' не сортирует файлы из архива при выводе, а 'tar tf archive.tgz | сортировать | xargs -I {} tar -Oxvf archive.tgz {} 'будет сортировать, а штраф по времени будет объясняться по причине, которую вы объяснили. Спасибо – theta

+0

@theta point taken - Я действительно рассмотрел возможность поместить заметку о возможном изменении заказа там, но решил, потому что 'tar tf' всегда будет генерировать тот же порядок, что и« tar x »извлекает их. Плохое решение в ретроспективе, поскольку это явно упрощенный пример. – je4d

1

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

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

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

+0

К сожалению, вы правы, я добавил '&&'. Моя проблема заключалась в том, что у меня были файлы, хранящиеся в архиве tar в несортированном порядке - так они были созданы - и мне нужно было выводить (grep) через содержимое архива tar, но в отсортированном порядке. Оказалось, что «tar» не может извлекать файлы по-разному, а затем для их сохранения, поскольку в конце концов «tar» был разработан как лента ARchiver. Как уже упоминалось ранее, «tar» не учитывает порядок файлов, указанных в файлеlist (-T switch), либо - он извлекает за один проход, и если файл находится в любом месте списка, он извлекает – theta

+0

@theta, он не соблюдает порядок нескольких команд либо они ведут себя так же, как '-T'. Проблема заключается в 'xargs -I {}' (см. Мой ответ) – je4d

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

  • Нет связанных вопросов^_^