에코를 사용하여 파일 이름의 마지막 부분 추출 - 와일드카드를 사용하여 변수 할당

에코를 사용하여 파일 이름의 마지막 부분 추출 - 와일드카드를 사용하여 변수 할당

파일 이름의 일부를 추출하려고 하는데 첫 번째 _ 이후의 모든 내용을 추출하고 싶습니다. 작동하는 솔루션을 찾았습니다. 아래를 참조하세요.

file=22NGS71294_S191_R1_001.fastq.gz
echo $file
22NGS71294_S191_R1_001.fastq.gz
echo ${file#*[_ ]}
S191_R1_001.fastq.gz

그러나 와일드카드를 사용하면 작동이 중지됩니다.

file2=*R1*
echo $file2
22NGS71294_S191_R1_001.fastq.gz
echo ${file2#*[_ ]}
22NGS71294_S191_R1_001.fastq.gz

$file 및 $file2에 대한 echo 명령이 정확히 동일한 결과를 제공하기 때문에 이것이 작동하지 않는 이유를 모르겠습니다. 누군가 이 동작을 설명할 수 있나요?

답변1

sh, ksh, bash( 또는zsh 아니요globassign옵션이 설정된 경우) 스칼라 할당의 RHS에서 파일 이름 생성(일명 "globbing")이 발생하지 않습니다.file2=*R1*

당신의 echo $file2보상은 22NGS71294_S191_R1_001.fastq.gz다음과 같습니다인용되지 않음확장은 이 시점에서 파일 이름 생성의 영향 을 $file2받지만 echo ${file2#*[_ ]}사실상 .echo ${'*R1*'#*[_ ]}echo *R1*언제 큰따옴표가 필요합니까?.

ksh/bash/zsh에서 사용할 수 있습니다대량으로할당 - 종종 *R1*여러 파일 이름이 생성될 수 있으므로 이 작업을 수행해야 합니다. 예를 들어 Bash에서는 다음과 같습니다.

shopt -s nullglob

file2=(*R1*)
echo "${file2[@]#*_}"

관련 정보