scp
여러 파일을 만들려고합니다 . 이렇게 하면 ls {aaa,bbb}*_list.txt
선택적인 파일만 볼 수 있습니다. 그러나 변수에 할당하고 명령에서 사용하려고 하면 scp
작동하지 않습니다.
나는 다음과 같이 시도했다
files_to_scp="{aaa,bbb}*_list.txt"
scp $files_to_scp user@host:.
오류가 발생합니다 {aaa,bbb}*_list.txt: No such file or directory
. 하지만 오류 경로( {aaa,bbb}*_list.txt
)를 복사하여 실행하면 ls
파일이 표시됩니다. 여기에 뭔가 문제가 있을 수 있습니다.
답변1
이것버팀대 확장유효한/가능한 파일 세트로 확장하려면 구문에 {aaa,bbb}
중괄호와 따옴표가 없는 문자가 포함되어야 합니다 . ,
OP에서는 "{aaa,bbb}*_list.txt"
그대로 리터럴 문자열로 유지하고 전혀 확장하지 마세요.
또한 중괄호 확장을 변수에 저장하고 해당 변수를 삽입하여 중괄호를 확장하는 것은 결코 작동하지 않습니다. 왜냐하면 중괄호 확장은 다른 쉘 확장보다 먼저 발생하기 때문입니다. 즉, 중괄호가 확장될 것으로 예상할 때 $files_to_scp
쉘은 이미 확장을 통과했습니다. 괄호 포인트
변수를 사용하는 것은아니요여러 단어를 잡는 올바른 방법. 파일 이름에 공백이나 기타 쉘 특수 문자가 포함되어 있으면 심하게 실패합니다. 배열 유형과 적절한 인용 확장 사용
files_to_scp=({aaa,bbb}*_list.txt)
이제 결과를 다음과 같이 사용하십시오.
scp "${files_to_scp[@]}" user@host:.
답변2
변수( files_to_scp
)에는 리터럴 문자열이 들어 있습니다 "{aaa,bbb}*_list.txt"
.아니요일치하는 모든 파일의 확장자입니다. bash는 스칼라 변수 할당 시 중괄호를 확장하지 않습니다.
그러나 bash는 이를 배열로 확장합니다. 대신 배열을 사용하세요.
예를 들어
files_to_scp=( {aaa,bbb}*_list.txt )
scp "${files_to_scp[@]}" user@host:.
다음은 무슨 일이 일어나고 있는지 보여주는 (단순하고 실용적인) 예와 설명입니다.
당신의 패턴과 일치하는 파일 묶음을 만들었습니다
$ mkdir spike $ cd spike $ touch {aaa,bbb}{01..10}_list.txt $ ls aaa01_list.txt aaa05_list.txt aaa09_list.txt bbb03_list.txt bbb07_list.txt aaa02_list.txt aaa06_list.txt aaa10_list.txt bbb04_list.txt bbb08_list.txt aaa03_list.txt aaa07_list.txt bbb01_list.txt bbb05_list.txt bbb09_list.txt aaa04_list.txt aaa08_list.txt bbb02_list.txt bbb06_list.txt bbb10_list.txt
변수 할당은 리터럴 문자열을 저장합니다.
$ files_to_scp="{aaa,bbb}*_list.txt" $ declare -p files_to_scp declare -- files_to_scp="{aaa,bbb}*_list.txt"
bash는 따옴표 없이 동일한 작업을 수행합니다.
$ files_to_scp={aaa,bbb}*_list.txt $ declare -p files_to_scp declare -- files_to_scp="{aaa,bbb}*_list.txt"
배열을 사용하면 일치하는 각 파일 이름이 배열의 요소로 저장됩니다.
$ files_to_scp=( {aaa,bbb}*_list.txt ) $ declare -p files_to_scp declare -a files_to_scp=([0]="aaa01_list.txt" [1]="aaa02_list.txt" [2]="aaa03_list.txt" [3]="aaa04_list.txt" [4]="aaa05_list.txt" [5]="aaa06_list.txt" [6]="aaa07_list.txt" [7]="aaa08_list.txt" [8]="aaa09_list.txt" [9]="aaa10_list.txt" [10]="bbb01_list.txt" [11]="bbb02_list.txt" [12]="bbb03_list.txt" [13]="bbb04_list.txt" [14]="bbb05_list.txt" [15]="bbb06_list.txt" [16]="bbb07_list.txt" [17]="bbb08_list.txt" [18]="bbb09_list.txt" [19]="bbb10_list.txt")