이것이 쉘 for 루프에서는 작동하지만 자체적으로는 작동하지 않는 이유는 무엇입니까?

이것이 쉘 for 루프에서는 작동하지만 자체적으로는 작동하지 않는 이유는 무엇입니까?

이게 왜 작동하는 걸까요?

for X in A* ; do cp $X/output.txt output/$X.txt ; done

하지만 이건 아니야

cp A*/output.txt output/A*.txt

A1, A2, A3, A4 등 여러 폴더의 output.txt 파일을 "output"이라는 결합 폴더로 복사하여 각 텍스트 파일에 원본 폴더의 이름을 지정합니다.

답변1

쉘이 A*.txt부품 을 확장하기 때문에다수의호출되는 명령에 전달되기 전의 경로입니다( cp이 경우).

즉, 첫 번째 경우 A1.txt, A2.txt, A3.txt 및 A4.txt라는 파일과 각각 output.txt를 포함하는 디렉터리 A1, A2, A3 및 A4가 있는 경우 다음으로 확장됩니다.같은 것:

for X in A1.txt A2.txt A3.txt A4.txt ; do cp $X/output.txt output/$X.txt ; done

두 번째 경우에는 다음과 같이 확장됩니다.

cp A1/output.txt A2/output.txt A3/output.txt A4/output.txt output/A*.txt

여기서 부분은 glob과 일치하는 디렉터리 output/A*.txt에 항목이 있는지 여부에 따라 확장되거나 확장되지 않을 수 있습니다 . output그렇다면 다음과 같이 더욱 악화됩니다.

cp A1/output.txt A2/output.txt A3/output.txt A4/output.txt output/A8.txt output/A9.txt

cp여러 소스 파일이 주어지면 대상을 원하기 때문에예배 규칙서결국에는 이를 처리하는 방법을 모르고 단순히 손을 내밀고 대신 오류를 제공합니다.

답변2

그 이유는 에 대한 인수가 두 개 이상인 경우 cp마지막 인수가~ 해야 하다디렉토리가 되십시오. 그만큼cp 맨페이지상태:

개요

cp [옵션]... [-T] 소스 대상

cp [옵션]... 소스... 디렉토리

cp [옵션]... -t 디렉토리 소스...

설명

SOURCE를 DEST로 복사하거나 여러 SOURCE를 DIRECTORY로 복사하세요.

당신이 쓴 명령은,

  cp file1 file2 file3 file4

뜻하는 바였다

 cp file1 file3; cp file2 file4

그러나 위의 이유로는 그렇지 않습니다. 대신 for 루프는 바로 위의 2개 문을 정확하게 생성하는데, 이것이 바로 여러분이 정말로 원하는 것입니다.

관련 정보