Tente:
find . -type f -exec gunzip {} +
Isso pressupõe que o diretório atual contém apenas arquivos que você deseja descompactar.
Eu tenho uma pasta com 36.348 arquivos de arquivos gz. Eu quero descompactar todos eles.
Em exibição:
gunzip ./*
resulta em
-bash: /usr/bin/gunzip: Argument list too long
Qual é a maneira mais fácil de contornar isso?
O limite está no kernel e está no tamanho cumulativo dos argumentos e do ambiente transmitidos à chamada de sistema execve()
usada para executar um comando. Você pode dividi-lo em várias invocações.
Para gunzip
todos os arquivos .gz
no diretório atual:
com zsh
:
autoload zargs # best in ~/.zshrc
zargs ./*.gz -- gunzip
com ksh93
:
command -x gunzip ./*.gz
GNUly:
printf '%sfind . ! -name . -prune -name '*.gz' -exec gunzip {} +
' *.gz | xargs -r0 gunzip
POSIXly (e com gunzip
):
ulimit -s unlimited
gunzip ./*.gz
(lembre-se de que também será descompactado os arquivos .gz
ocultos)
Ou você pode aumentar esse limite em alguns sistemas. Em versões recentes do Linux:
autoload zargs # best in ~/.zshrc
zargs ./*.gz -- gunzip
A maneira mais simples que encontrei é:
gunzip -r .
Uma solução pouco eficiente seria
find $PWD -type f -name "*.gz" -print0 | xargs -0 gunzip
Mas se o seu find não tiver a opção -print0 e seus arquivos / dir não tiverem espaço na nomenclatura, você poderá pular os argumentos -print0 e -0.
Um processo menos eficiente (mas de longo prazo, muito flexível) é criar um arquivo em lotes:
ls | grep .gz | sed -e 's/^/gunzip /' | less
mostra o que vai acontecer, então um simples erro de digitação não aniquila seu sistema
ls | grep .gz | sed -e 's/^/gunzip /' | bash
faz isso agora
ls | grep .gz | sed -e 's/^/gunzip /' > unpack
at 02:00
bash unpack
<ctrl-d>
faz isso durante a noite
(note que este exemplo não considera espaços em nomes de arquivos.)