У меня есть папка, содержащая приблизительно 320116 файлов .pdb.gz. Я хочу распаковать их всех. Если я использую gunzip * .gz, это выдает ошибку, т.е. список аргументов слишком длинный. Папка составляет около 2 ГБ. Пожалуйста, дайте мне соответствующее предложение.
13
Ответы:
-exec gunzip {} +
предоставитgunzip
много, но не слишком много имен файлов в командной строке. Это более эффективно, чем-exec gunzip {} \;
запуск новогоgunzip
процесса для каждого файла.источник
find
, меньшеgunzip
!find
допускают нотацию «+». Смотрите, например, наfind
странице руководства BSD 10.1 . Также относится к OS X (10.9 и позже, по крайней мере, может быть, раньше).Всякий раз, когда вы получаете ошибки «список аргументов слишком длинный», вы можете обойти это, вызвав нужную команду несколько раз, каждый раз с подмножеством аргументов, которые вы хотите использовать.
xargs
это инструмент, который поможет вам сделать это автоматически.источник
-execdir gunzip "{}" \;
то есть то, что xargs будет вызывать gunzip отдельно для каждого файла? Это мое чтение страницы руководства.xargs
заполнит столько имен файлов, сколько поместится вgunzip
командной строке. Попытайся!echo a b c d e f | xargs echo
вызывается толькоecho
один раз со всеми 6 аргументами, так что вы видите одну строку вывода (довольно бесполезная команда для выполнения, хотя !!!!), в то время как если вы заставляетеxargs
указывать только 3 аргумента за вызов команды, используя,echo a b c d e f | xargs -n 3 echo
то вы получите 2 строки вывода ,xargs
является то, что с помощью этой-P
опции вы можете запускать несколькоgunzip
процессов параллельно, что (в зависимости от точных параметров вашей системы) может идти быстрее.-P
@psmears. Теперь я тоже кое-что узнал!Я думаю, что это должно работать, он передает путь / имя каждого файла в gunzip для обработки:
источник
find
с+
иxargs
явно дизайнер с именно этой проблемой в виду. Они всегда будут указывать столько аргументов, сколько смогут, не превышая ограничения операционной системы. Потому что, кстати, он является ценз работы системы, ничего общего сgunzip
.Попробуйте так:
источник
gunzip
один раз для каждого файла. См . Ответ Джона 1024 о том, как избежать этой неэффективности.Если у вас многоядерный компьютер, вы, вероятно, увидите, что его использование
gunzip
не позволит максимально использовать возможности вашего компьютера. Для этого вам нужно будет запустить несколькоgunzip
s параллельно. Следить за тем, что сделано, в каком терминале вручную, является громоздким, но вы можете легко сделать это с помощью параллельной GNU:источник
parallel
слишком длинный?find
слишком долго?find
командной строке.-name
find
Нет необходимости использовать для этого, так как вы не упомянули подпапки. Что вам нужно сделать, это:источник
find
если вы не хотите , чтобы породить 320116gunzip
процессы, так же , как этот цикл делает.