이게 왜 작동하는 걸까요?
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개 문을 정확하게 생성하는데, 이것이 바로 여러분이 정말로 원하는 것입니다.