Eu tenho uma pasta que contém aproximadamente 320116 arquivos .pdb.gz. Eu quero descomprimir todos eles. Se eu usar o gunzip * .gz, ocorrerá um erro, ou seja, a lista de argumentos é muito longa. A pasta tem cerca de 2 GB. Por favor, me dê uma sugestão apropriada.
13
Respostas:
-exec gunzip {} +
fornecerágunzip
muitos, mas não muitos, nomes de arquivos em sua linha de comando. Isso é mais eficiente do-exec gunzip {} \;
que inicia um novogunzip
processo para cada arquivo.fonte
find
, menosgunzip
!find
permitem a notação "+". Veja, por exemplo, afind
página de manual do BSD 10.1 . Também se aplica ao OS X (10.9 e posterior, pelo menos, talvez antes).Sempre que você receber erros de "lista de argumentos muito longa", poderá contorná-lo invocando o comando desejado várias vezes, sempre com um subconjunto dos argumentos que deseja usar.
xargs
é uma ferramenta que ajuda você a fazer isso automaticamente.fonte
-execdir gunzip "{}" \;
que os xargs invocam o gunzip separadamente para cada arquivo? Essa é a minha leitura da página de manual.xargs
colocará quantos nomes de arquivos caberem nagunzip
linha de comando. Tente!echo a b c d e f | xargs echo
invoca apenasecho
uma vez com todos os 6 argumentos, para que você veja uma linha de saída (comando bastante inútil para executar embora !!!!) enquanto que se você forçarxargs
a fornecer apenas até 3 argumentos por invocação do comando usandoecho a b c d e f | xargs -n 3 echo
, obtém 2 linhas de saída .xargs
é que, com a-P
opção, você pode executar váriosgunzip
processos em paralelo, os quais (dependendo dos parâmetros exatos do seu sistema) podem ser mais rápidos.-P
@psmears. Agora eu aprendi algo também!Eu acho que isso deve funcionar, ele passa o caminho / nome de cada arquivo individualmente para gunzip para processamento:
fonte
find
com+
exargs
são expressamente projetistas, com exatamente esse problema em mente. Eles sempre fornecerão o maior número possível de argumentos, sem exceder o limite do sistema operacional. Porque, a propósito, é um limite do sistema operacional, nada a vergunzip
.Tente desta maneira:
fonte
gunzip
uma vez por arquivo. Veja a resposta de John1024 para uma maneira ligeiramente diferente que evita essa ineficiência.Se você possui uma máquina com vários núcleos, provavelmente verá que esse uso
gunzip
não maximizará os recursos da sua máquina. Para isso, você precisaria executar váriosgunzip
s em paralelo. Acompanhar o que é feito em que terminal é manualmente é complicado, mas você pode fazer isso facilmente com o GNU paralelo:fonte
parallel
é muito longa?find
é muito longa?find
linha de comando.-name
Não é necessário usar
find
isso, pois você não mencionou subpastas. O que você precisa fazer é:fonte
find
se você não quer gerar 320116gunzip
processos, tal como este laço faz.