Solução alternativa para fazer várias cópias de um único arquivo usando a linha de comando?

3

Estou tentando copiar um arquivo para 10 arquivos. Por exemplo, eu tenho uma mensagem de email chamada test1.eml . Eu quero 10 cópias do mesmo arquivo.

Quando eu procurei na internet, me deparei com esse thread stackoverflow link e seguiu o comando eval mencionado por um dos membros da comunidade 'knittl'.

eval 'cp test1.eml 'test{2..10}.eml';'

O comando acima mencionado funcionou e satisfez meus requisitos. Existem outros comandos alternativos / mais elegantes para conseguir isso, já que a pessoa que mencionou o comando eval disse que é uma espécie de invasão.

    
por dkarthik 29.02.2016 / 13:09

2 respostas

11

Eu faria algo como for i in {2..10}; do cp test1.eml test$i.eml; done
Ainda é mais ou menos a mesma coisa.

    
por 29.02.2016 / 13:19
6
 tee >test2.eml test{3..10}.eml < test1.xml

só leria a fonte uma vez e executaria apenas um comando. Pode não ser mais eficiente para arquivos grandes e poderia incentivar a fragmentação, pois tee gravaria blocos de dados em cada arquivo de saída. Ele também cria arquivos com permissões de acordo com sua umask atual, em vez de reproduzir parcial ou completamente as permissões originais, pois cp depende das opções.

Se você quiser salvar a digitação, use apenas zsh como seu shell (é aí que as construções {2..10} vêm de btw)

 for f (test{2..10}.eml)cp test1.eml $f

O que é tão curto quanto o seu:

 eval 'cp test1.eml 'test{2..10}.eml';'

ainda mais intuitivo / legível e mais facilmente generalizável para nomes de arquivo com caracteres mais problemáticos.

Com zsh e supondo que você não tenha desativado a opção multios , você também pode fazer:

<test1.eml >test{2..10}.eml

Lá, zsh faz o tee internamente e também invoca cat . Portanto, é um pouco menos eficiente do que a abordagem tee .

    
por 29.02.2016 / 14:06