Copie um arquivo várias vezes com nomes que vêm de uma lista

2

Eu tenho uma lista de nomes e tenho um arquivo binário. Eu quero copiar esse arquivo binário para que haja uma cópia para cada membro da lista. A lista é um arquivo de texto com um nome em cada linha. Eu continuo voltando para

for i in $(cat ../dir/file); do cp binaryfile.docx "$i_binaryfile.docx"; done

Não há erro. Apenas um arquivo chamado _binaryfile.docx é criado.

Eu olhei para este [Copy-a-file-to -a-destino-com-nomes-diferentes] e [duplicate-file-x-times-in-command-shell] mas não consigo ver como eles são diferentes.

    
por RobH 10.10.2018 / 16:48

2 respostas

2

Deve ser:

for i in $(cat file); do cp binaryfile.docx "${i}_binaryfile.docx"; done

EDITAR:

Você pode reproduzi-lo com este exemplo:

$ i=1
$ echo $i
1
$ echo $i_7

$ echo ${i}_7
1_7

O ponto é que o caractere _ ( sublinhado ) é permitido na variável nome. Você pode ler sobre isso em man bash , mas tenha em mente que é escrito em uma linguagem muito técnica e sucinta:

   name   A  word  consisting  only  of alphanumeric characters and underscores, and
          beginning with an alphabetic character or an underscore.  Also referred to
          as an identifier.

E mais tarde:

A variable is a parameter denoted by a name.

E:

   ${parameter}
          The value of parameter is  substituted.   The  braces  are  required  when
          parameter  is  a  positional  parameter  with more than one digit, or when
          parameter is followed by a character which is not  to  be  interpreted  as
          part  of  its name.  The parameter is a shell parameter as described above
          PARAMETERS) or an array reference (Arrays).

Então, se temos uma variável chamada i e queremos imprimir sua valor próximo ao _ adjacente, temos que incluí-lo em {} para informar Bash que o nome da variável termina antes de _ .

    
por 10.10.2018 / 17:02
0

Você tem dois problemas em seu comando:

O primeiro já foi descrito pela resposta do @Arkadiusz Drabczyk:

O sublinhado é um caractere válido para nomes de variáveis, portanto, o nome da variável não é interrompido após $i . Você deve usar ${i} .

O segundo problema: você não deve percorrer as linhas de um arquivo usando for line in $(cat file); ... . Embora isso possa funcionar para você nesse caso, geralmente é uma prática muito ruim, pois dividirá as palavras e não as linhas.

É melhor usar outra coisa, por exemplo,

xargs -a file -I{} cp binaryfile.docx "{}_binaryfile.docx"

ou

while IFS= read -r i; do
    cp binaryfile.docx "${i}_binaryfile.docx"
done < file
    
por 10.10.2018 / 17:39