使用来自列表的名称多次复制文件

使用来自列表的名称多次复制文件

我有一个姓名列表和一个二进制文件。我想复制该二进制文件,以便列表中的每个成员都有一个副本。该列表是一个文本文件,每一行都有一个名称。我不断回来

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

没有错误。仅创建一个名为 _binaryfile.docx 的文件。

我看过这个[将文件复制到具有不同名称的目的地][在命令 shell 中重复文件 x 次]但我看不出它们有何不同。

答案1

它应该是:

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

编辑:

您可以通过以下示例重现它:

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

$ echo ${i}_7
1_7

重点是_下划线) 字符可以出现在变量名中。您可以阅读以下内容,man bash但请记住,它是用非常技术性、简洁的语言编写的:

   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.

后来:

A variable is a parameter denoted by a name.

和:

   ${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).

因此,如果我们有一个名为的变量i,并且想要在相邻的旁边打印它的值,则_必须将其括起来{}以告诉 Bash变量的名称在 之前结束_

答案2

您的命令有两个问题:

第一个已经由@Arkadiusz Drabczyk 回答描述过:

下划线是变量名称的有效字符,因此变量名称不会在 后停止$i。你应该使用${i}.


第二个问题:您不应该使用for line in $(cat file); ....虽然在这种情况下这可能对您有用,但这通常是非常糟糕的做法,因为它会分割单词,而不是行。

最好使用其他东西,例如

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

或者

while IFS= read -r i; do
    cp binaryfile.docx "${i}_binaryfile.docx"
done < file

相关内容