.
Deseja copiar ou mover 5.00.000 ou mais arquivos de uma só vez, mas o terminal reclama que a “lista de argumentos é muito longa”.
Se você criou muitos arquivos usando o método descrito neste artigo (“crie vários arquivos e diretórios de uma só vez em um terminal Linux”), pode ser difícil movê-los ou copiá-los todos de uma vez para um novo local.
Felizmente, existem alguns métodos para mover ou copiar de forma rápida e fácil um grande número de arquivos no Linux. Um desses métodos é usar as ferramentas de linha de comando cp
, tar
e rsync
que permitem copiar e mover um grande número de arquivos de forma rápida e fácil, mas têm um certo limite após o qual um comando gerará um erro.
Então, vamos dar uma olhada em como copiar e mover com eficiência um grande número de arquivos da linha de comando.
Crie um problema para mover um grande número de arquivos usando o comando touch
Por uma questão de clareza, deixe-me usar meu sistema para criar 5.00.000 arquivos com o touch
comandoque levará alguns minutos, e então testaremos nossos comandos nos arquivos recém-criados.
Se desejar, você também pode criar um grande número de arquivos executando o seguinte comando:
$ for i in {1..500000};do touch filename$i.txt; done
Assim que estiver pronto, deixe-me executar o mv
comando para mover todos os arquivos para o novo local. Como esperado, o terminal imprime “mv * temp zsh: lista de argumentos muito longa: mv.”
Resolva um problema para mover um grande número de arquivos usando o comando find
A razão é simples: o kernel tem algumas limitações que variam de sistema operacional para sistema operacional que restringem o número de argumentos que você pode passar em uma única linha de comando.
E quando você executa comandos como mv
, cp
, rm
ou tar
sua lista de argumentos se torna muito longa à medida que o número de arquivos aumenta além do limite do kernel, e isso eventualmente levará ao erro de lista de argumentos muito longa.
Para resolver este problema, podemos usar o find
comando com o -exec opção para executar nosso comando no grande número de arquivos
Mas se você quiser saber o limite do kernel, pode executar o comando getconf ARG_MAX
no seu terminal, que lhe dará o número máximo de argumentos que podem ser passados em uma única linha de comando para evitar o erro de argumentos.
Tudo bem, chega de bate-papo! Deixe-me agora demonstrar um método para copiar ou mover rapidamente um grande número de arquivos de um terminal.
Seção de Comando
Ao utilizar o find
comando com -exec opção, permite uma cópia muito mais eficiente de grandes quantidades de arquivos, facilitando o acesso dos usuários aos seus dados e armazená-los no local especificado
Quando você deseja copiar um grande número de arquivos, deve usar o comando find com -execque copiará o arquivo do resultado de um comando find e o moverá para o local especificado.
Aqui está a sintaxe que você precisa usar em seu terminal; apenas substitua os dados pelos reais.
$ find /FILE-PATH/ -name "PASS-FILE-PATTERN" -exec cp {} "/PASS-TARGET-DIRECTORY/" ;
Digamos que eu queira copiar todos os arquivos em /home/shen/test-arena para o novo diretório /home/shen/test-dircriarei o seguinte comando para copiar todos os arquivos.
$ find /home/shen/test-arena -name "filename*" -exec cp {} -v /home/shen/test-dir ;
O mesmo que posso fazer para mover todo o arquivo grande de arena de teste para test-dir apenas substituindo o comando cp por mv e rest todas as coisas serão as mesmas
$ find /home/shen/test-arena -name "filename*" -exec mv {} -v /home/shen/test-dir ;
E você pode até mesmo restringir o comando find para procurar arquivos apenas no diretório atual usando o comando -profundidade máxima parâmetros, como mostrado no comando abaixo:
$ find . -maxdepth 1 -name "file_*" -exec cp {} -v target/ ;
or
$ find . -maxdepth 1 -name "file_*" -exec mv {} -v target/ ;
Embrulhar
Espero que este artigo tenha ajudado você a entender como mover e copiar muitos arquivos em um sistema baseado em Unix e como descobrir qual é o limite do kernel.
Se você conhece algum outro método de mover e copiar um grande número de arquivos, compartilhe-os na seção de comentários.
Com isso em mente, vou encerrar este guia. Se você tiver mais sugestões, compartilhe-as abaixo.
Um homem com uma tecnologia efusiva que explorou algumas das incríveis coisas da tecnologia e está explorando mais. Enquanto avançava, tive a chance de trabalhar no desenvolvimento Android, Linux, AWS e DevOps com várias ferramentas de código aberto.
.