목록의 이름을 사용하여 파일을 여러 번 복사

목록의 이름을 사용하여 파일을 여러 번 복사

이름 목록과 이진 파일이 있습니다. 목록의 각 구성원이 복사본을 갖도록 이 바이너리의 복사본을 만들고 싶습니다. 목록은 텍스트 파일이며 각 줄에는 이름이 있습니다. 난 계속 돌아오는데

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

명령에 두 가지 문제가 있습니다.

첫 번째는 이미 @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

관련 정보