リストの名前を使用してファイルを複数回コピーする

リストの名前を使用してファイルを複数回コピーする

名前のリストとバイナリファイルがあります。リストの各メンバーがコピーを持つように、このバイナリのコピーを作成したいと思います。リストはテキストファイルで、各行には名前があります。私は戻ってきます。

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

エラーはありません。 _binaryfile.docxという名前のファイルのみが生成されます。

私はこれを見たことがある[別名でターゲットにファイルをコピー] そして[コマンドシェルでファイルを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

コマンドには2つの問題があります。

最初はすでに@Arkadiusz Drabczykの答えとして説明されています。

アンダースコアは変数名に有効な文字なので、変数名はアンダースコアの後に終わりません$i。を使用する必要があります${i}


2番目の質問:を使用しないでください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

関連情報