Как использовать GNU параллельно с gunzip

5464
gc5

У меня есть полный каталог .gz, я хочу расширить каждый архив параллельно с GNU параллельно. Однако я ничего не добился.

Я старался

parallel 'gunzip {}' ::: `ls *.gz` parallel gunzip `ls *.gz` 

без результатов, bash говорит мне:

/bin/bash: archive1.gz: command not found ... 

Что я делаю неправильно?

Спасибо

6
Параллельно GNU, +1 n13 10 лет назад 2
Параллель GNU не доступна на моей платформе. Есть ли способ сделать это с помощью xargs (я не хочу запускать больше экземпляров gz, чем количество ядер). user2284570 9 лет назад 0

2 ответа на вопрос

6
terdon

I found this, which suggests using the --gnu flag:

parallel --gnu gunzip ::: *gz 

If this works, you should either delete /etc/parallel/config or change its contents to --gnu rather than --tollef (as root):

echo "--gnu" > /etc/parallel/config 

Also, never parse the output of ls., use globbing as I have above or find instead:

find . -name "*gz*" -print0 | parallel -q0 gunzip 
Это полностью работает .. спасибо за советы и исправления. gc5 10 лет назад 0
Синтаксический анализ выходных данных `ls` менее важен при передаче в GNU Parallel. Пока у вас нет злоумышленников, делающих имена файлов, содержащие \ n, вы в безопасности. В этом случае, однако, `::: * .gz`, вероятно, будет лучшим. Ole Tange 10 лет назад 1
Поместить \ n в имена файлов действительно весело, спасибо за подсказку. Однако для небольших задач администратора это не должно быть проблемой, поэтому не стоит привыкать использовать какой-то другой инструмент IMHO. Aki 10 лет назад 0
@ Аки На самом деле ОЧЕНЬ много стоит выработать привычку использовать правильный инструмент для работы. Выходные данные `ls` изменяются между * nix-вариантами и настройками локали, это имеет тенденцию ломаться на любом виде пробела, не только на новых строках, вы избежите большой боли, если привыкнете не анализировать ls. Globbing это и проще, и безопаснее. terdon 10 лет назад 0
@terdon: `для i в $ (ls) выполните команду" $ i "; готово`, я очень часто этим пользуюсь и не всегда подхожу. Привыкание к привычкам, понимание ограничений инструментов, которые я использую, конечно, при выполнении чувствительных задач важно быть осторожным, но нужно оставить место для быстрых идиом, которые просто работают, независимо от того, что они не подходят для всего Aki 10 лет назад 0
@Aki `для меня в *; выполнить команду "$ i"; done` легче написать и безопаснее Почему вы хотите выучить идиому, которая сложнее и рискованнее? Попробуйте `for i in $ (ls)` в каталоге, содержащем файлы с пробелами в именах. Серьезно, синтаксический анализ `ls 'почти всегда не является правильным или самым простым способом сделать что-либо. Если глобирование не вариант, используйте `find`. Если вы настаиваете на использовании `ls`, по крайней мере, не используйте цикл` for`, это намного безопаснее: `ls | пока читаю я; выполнить команду "$ i"; по крайней мере, это не сломается на пробелах. terdon 10 лет назад 1
@terdon: не думал об использовании там глобинга и спасибо за совет цикла пока. Я продолжал использовать что-то, потому что я бы не стал учиться лучше, это исправлено Aki 10 лет назад 0
@terdon: GNU параллель не доступна на моей платформе. Есть ли способ сделать это с помощью xargs (я не хочу запускать больше экземпляров gz, чем количество ядер). user2284570 9 лет назад 0
0
parkydr

Doing this works:

 ls *.gz | parallel -t gunzip 

The -t is optional but is useful as it shows you the commands that are executed on stderr.

I'm not sure you are doing anything wrong ::: should work (it's meant to be equivalent) but not even the examples in the man page work for me.

Update: the --gnu flag makes it work as terdon said.

Я не знаю почему, но это не работает: `gzip: stdin: не в формате gzip` .. В любом случае, спасибо gc5 10 лет назад 0
Странно, у меня работает parkydr 10 лет назад 0
Да, это странно .. Какую платформу вы используете? gc5 10 лет назад 0
Debian Джесси / Сид (тестирование). У ваших файлов были пробелы в именах? parkydr 10 лет назад 0
Пространства работали также parkydr 10 лет назад 0
Нет у них нет .. Я использую Ubuntu 12.04 LTS .. gc5 10 лет назад 0