technology

Como resolver o erro de lista de argumentos muito longa no comando do Linux

.

Cada comando, como cp, mv, rm, tar, rsync, grep, e assim por diante, produz o erro “comando: lista de argumentos muito longa”. Por que isso acontece e como faço para corrigir isso?

Quando os usuários do Linux tentam executar um comando com muitos argumentos, eles podem receber um erro informando “lista de argumentos muito longa.”

Este erro acontece porque todo sistema tem um tamanho máximo da lista de argumentose quando um determinado comando possui muitos argumentos, o sistema lança uma mensagem de erro.

Para corrigir esse problema, os usuários podem empregar várias soluções, como dividir o comando em partes menores usando um loop, canalizar a saída do comando para um arquivo ou utilizar xargs para dividir o comando em partes gerenciáveis.

Mas antes de chegarmos à parte sobre as soluções, deixe-me primeiro mostrar como são os problemas e quando eles se tornam ativos em seu sistema.

Quando você veria o erro “lista de argumentos é muito longa”?

Como afirmei anteriormente, comandos como cp, mve rm lançará um erro se você tentar manipular um grande número de arquivos de uma só vez. Para mostrar o erro, permita-me usar o touch comando para criar uma coleção de 5.00.000 arquivos de uma só vez.

Não é possível para você e para mim digitar cinco mil nomes de arquivos exclusivos no terminal. No entanto, ao utilizar expansão de cintapodemos chegar ao resultado mostrado abaixo:

$ touch filename{1..500000}.txt

Leia também: O comando touch faz muito mais do que apenas criar um arquivo vazio

E, como esperado, o comando imprime um erro na tela da seguinte forma:

o comando touch falhou ao criar um grande número de arquivos

De alguma forma, consegui criar um grande número de arquivos usando este guia, mas quando tentei listar, mover, copiar, remover ou até mesmo criar um arquivo, todos falharam conforme mostrado abaixo.

O comando falhou ao manipular um grande número de arquivos
O comando falhou ao manipular um grande número de arquivos

Como todos estão na mesma página sobre o problema agora, vamos tentar encontrar uma solução.

Corrija o erro “lista de argumentos muito longa” para todos os comandos

Para corrigir o “erro de lista de argumentos muito longa” para todos os comandos, devemos primeiro entender o que está causando isso.

Como você sabe, ocorre quando a lista de argumentos excede o número máximo de argumentos que o sistema pode manipular, mas como posso saber qual é esse máximo?

A resposta pode ser encontrada executando o getconf ARG_MAX comando, que retornará o número máximo de argumentos que podem ser passados ​​para um comando.

Isso nos permite saber o número exato de argumentos que nosso comando pode ter, que podem ser diferentes dependendo do sistema operacional, versão do kernel e shell que estão sendo usados.

Depois de saber qual é o tamanho máximo do argumento, podemos ajustar nossos comandos de acordo para evitar ultrapassar esse limite.

Seção de Comando

Uma das maneiras mais fáceis de corrigir o erro “lista de argumentos muito longa” é usar xargs com o find comando, que pegará a saída do comando find e a dividirá em blocos que estejam dentro do limite máximo de argumentos.

Além disso, você também pode usar instruções de loop em seus scripts para iterar a saída de find e dividi-la em partes menores que podem ser passadas para outros comandos.

Se você puder usar os caracteres curinga, poderá aproveitá-los para manipular arquivos do sistema com base em padrões, o que garantirá que a lista de argumentos não ultrapasse o limite máximo

Depois de muita discussão teórica, é hora de entrar no aspecto prático dessas soluções.

solução de comando de toque

Primeiro de tudo, vamos criar um grande número de arquivos usando o touch comandoque falhou acima, e use a função de loop para iterar e criar arquivos exclusivos de 500 mil.

Para evitar que sua estrutura de diretório atual fique bagunçada, sugiro que você execute o seguinte comando no novo diretório.

$ mkdir test-arena && cd test-arena 
$ for i in {1..500000}; do touch filename$i.txt; done

solução de comando cp

Então deixe-me usar o find comando em conjunção com --exec ou então canalizar a saída para xargs para copiar todo este arquivo para um novo diretório:

$ find /home/shen/test-arena -name "filename*" -exec cp {} -vt /home/shen/test-dir ;
or
$ find /home/shen/test-arena -name "filename*" | xargs cp -vt /home/shen/test-dir

Você pode fazer o mesmo com um “loop for”, mas é lento comparado ao anterior, mas você ainda pode tentar.

$ for i in /home/shen/test-arena/filename*; do cp "$i" -vt /home/shen/test-dir ; done

Você também pode usar caracteres curinga para copiar um arquivo de um diretório para outro dividindo o arquivo. Deixe-me dar um exemplo simples: copiar um arquivo do intervalo de 1 a 100 para outro diretório.

$ cp /home/shen/test-arena/filename{1..100}.txt -vt /home/shen/test-dir

solução de comando mv

Mas agora quero mover os arquivos para um local diferente. Nesses cenários, você pode simplesmente usar o seguinte comando para mover todos os arquivos grandes ao mesmo tempo:

$ find /home/shen/test-arena -name "filename*" -exec mv {} -vt /home/shen/test-dir ;
or
$ find /home/shen/test-arena -name "filename*" | xargs mv -vt /home/shen/test-dir

É possível mover todos os arquivos grandes usando um loop? Sim, você pode fazer isso executando o comando abaixo; apenas certifique-se de substituir o caminho do arquivo pelo caminho real.

$ for i in /home/shen/test-arena/filename*; do mv "$i" -vt /home/shen/test-dir ; done

Não quero mover todos os arquivos; Eu só quero mover um intervalo específico de arquivos. Em seguida, execute o comando abaixo:

$ mv /home/shen/test-arena/filename{1..100}.txt -vt /home/shen/test-dir

solução de comando rm

Depois de aprender tudo isso, vamos remover todos os arquivos do sistema suprimindo o erro “lista de argumentos muito longa”.

Para concluir a tarefa, deixe-me executar o seguinte comando:

$ find ~/test-dir -name "filename*" -exec rm {} -v ;
or
$ find /home/shen/test-arena -name "filename*" | xargs rm -v

Leia também: O que você precisa saber sobre o comando rm no Linux e sua sintaxe avançada

Até eu posso remover todos os arquivos grandes do meu sistema usando o mecanismo de loop:

$ for i in /home/shen/test-arena/filename*; do rm -v "$i" ; done

Mas se eu não quiser excluir todos os arquivos grandes, exceto um intervalo específico de arquivos, devo usar o seguinte comando:

$ rm -v /home/shen/test-arena/filename{1..100}.txt

Embrulhar

Estas são algumas maneiras de resolver o erro “Lista de argumentos muito longa”. Você pode experimentar diferentes métodos e escolher aquele que melhor se adapta às suas necessidades.

Se você conhece outras maneiras de realizar a mesma tarefa, sinta-se à vontade para comentar e compartilhá-las conosco para que possamos aprender uns com os outros.

De qualquer forma, se houver algo que eu precise considerar, use o espaço abaixo para fornecer qualquer informação adicional ou feedback.

Até lá, coloque os pés para cima e relaxe. Como sempre, o próximo artigo será publicado em breve.

.

Mostrar mais

Artigos relacionados

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Botão Voltar ao topo