Arquivo duplicado x vezes no shell de comando

15

Eu tento duplicar um arquivo de vídeo x vezes da linha de comando usando um loop for, eu tentei assim, mas não funciona:

for i in {1..100}; do cp test.ogg echo "test$1.ogg"; done
    
por Black 21.06.2016 / 08:34

5 respostas

19

Seu código de shell tem dois problemas:

  1. O echo não deveria estar lá.
  2. A variável $i é digitada incorretamente como $1 no nome do arquivo de destino.

Para fazer uma cópia de um arquivo no mesmo diretório do arquivo, use

cp thefile thecopy

Se você inserir mais alguma coisa lá, por exemplo,

cp thefile theotherthing thecopy

presume-se que você gostaria de copiar thefile e theotherthing no diretório chamado thecopy .

No seu caso, ele procura especificamente por um arquivo chamado test.ogg e um chamado echo para copiar para o diretório test$1.ogg .

O $1 provavelmente será expandido para uma string vazia. É por isso que, quando você exclui o echo do comando, obtém "test.ogg e test.ogg são os mesmos arquivos"; o comando sendo executado é essencialmente

cp test.ogg test.ogg

Este é provavelmente um erro de digitação.

No final, você quer algo assim:

for i in {1..100}; do cp test.ogg "test$i.ogg"; done

Ou, como alternativa

i=0
while (( i++ < 100 )); do
  cp test.ogg "test$i.ogg"
done

Ou usando tee :

tee test{1..100}.ogg >/dev/null <test.ogg
    
por 21.06.2016 / 09:02
10

Curto e preciso

< test.ogg tee test{1..100}.ogg

ou melhor ainda

tee test{1..100}.ogg < test.ogg >/dev/null

veja uso do comando tee para mais ajuda.

Atualizar

como sugerido por @Gilles, usar tee tem o defeito de não preservar nenhum metadado de arquivo. Para superar esse problema, você pode ter que executar o comando abaixo depois disso:

cp --attributes-only --preserve Source Target
    
por 21.06.2016 / 08:59
9
for i in {1..100}; do cp test.ogg "test_$i.ogg" ; done
    
por 21.06.2016 / 08:45
1

O comando seguinte copiará arquivo.a 5 vezes:

$ seq 5 | xargs -I AA cp file.a fileAA.a

Se você preferir dd (não é o mesmo que cp!):

$ seq 5 | xargs -I AA dd if=file.a of=fileAA.a
    
por 15.01.2018 / 15:17
0

Você não chamou a variável i durante a cópia

use abaixo do script. Como testado funcionou bem

for i in {1..10}; do cp -rvfp test.ogg test$i.ogg ;done
    
por 15.01.2018 / 15:32