디렉토리에 관심 있는 파일이 20개 있습니다. 5개의 그룹으로 나눌 수 있으며, 각 그룹은 파일 이름에 626에서 630 사이의 숫자로 식별됩니다. 예를 들어 (가설적으로)
the-quick-brown-fox-jumps-over-627-lazy-dogs_1_bbduk.fq
.
각 그룹을 반복하고 파일 경로를 텍스트 변수로 임시 저장하고 싶습니다(루프의 다른 명령과 함께 사용 for
). 이것이 내가 지금 가지고 있는 것입니다:
for i in {626..630};do
fw1=$(/scratch/[username]/data/*"$i"-*_1_bbduk.fq)
fw2=$(/scratch/[username]/data/*"$i"_*_1_bbduk.fq)
rv1=$(/scratch/[username]/data/*"$i"-*_2_bbduk.fq)
rv2=$(/scratch/[username]/data/*"$i"_*_2_bbduk.fq)
done
문제: 올바른 경로를 얻었지만(경로당 하나의 옵션만) "권한이 거부되었습니다"라고 표시되고 나중에 변수를 텍스트로 사용할 수 없는 것 같습니다. bash가 그것을 실행하려고 하는 것 같은데, 이는 내가 원하는 것이 아닙니다.
주위에 작은따옴표를 추가해 보았습니다(예: fw1='$(/scratch/[username]/data/*"$i"-*_1_bbduk.fq)'
와일드카드가 제거되었습니다. 큰따옴표("")를 고려했지만 "$i" 변수를 엉망으로 만들지 않고 이를 사용하는 방법을 잘 모르겠습니다. echo
예를 들어 사용해 보았지만 fw1=echo $(/scratch/[username]/data/*"$i"-*_1_bbduk.fq)
여전히 "권한 거부" 문제가 있습니다.
답변1
Bash는 각 파일을 다음으로 래핑하기 때문에 파일 이름을 지정하려고 합니다.
$( ... )
이것이 원하는 것이 아니라면 다음을 사용하십시오.
for i in {626..630}; do
fw1=/scratch/[username]/data/*"$i"-*_1_bbduk.fq
fw2=/scratch/[username]/data/*"$i"_*_1_bbduk.fq
rv1=/scratch/[username]/data/*"$i"-*_2_bbduk.fq
rv2=/scratch/[username]/data/*"$i"_*_2_bbduk.fq
done
편집하다:
귀하의 의견에 따르면 다음 코드가 귀하가 원하는 것일 수 있습니다.
for i in {626..630}; do
fw1="$(compgen -G /scratch/[username]/data/*"$i"-*_1_bbduk.fq)"
fw2="$(compgen -G /scratch/[username]/data/*"$i"_*_1_bbduk.fq)"
rv1="$(compgen -G /scratch/[username]/data/*"$i"-*_2_bbduk.fq)"
rv2="$(compgen -G /scratch/[username]/data/*"$i"_*_2_bbduk.fq)"
done
답변2
Jim이 정확하게 식별합니다.코드에 문제가 있지만 (IMO) 더 나은 솔루션은 이미 가지고 있는 솔루션에 더 가깝습니다.
fw1=(/스크래치/사용자 이름/data/*"$i"-*_1_bbduk.fq)
(참고: 아니요$
)은 glob과 일치하는 파일 이름 배열을 제공합니다. 조금 어색한 점은 ${#fw1[@]}
배열에 요소가 몇 개 있는지 알려주는 것입니다. 예를 들어, 숫자가 이면 , 및 를 사용하여 4개의 요소에 액세스 4
할 수 있습니다
${fw1[0]}
. 그러나 plain은 이를 제공하므로 각 패턴과 일치하는 파일이 있을 것이라고 110% 확신한다면 짧은 형식을 사용할 수 있습니다.${fw1[1]}
${fw1[2]}
${fw1[3]}
$fw1
${fw1[0]}
또는,당신은 말할 수 있습니다
fw1=$(에코/스크래치/사용자 이름/data/*"$i"-*_1_bbduk.fq)
다시 말하지만, 당신은 가깝습니다. (단, 패턴과 일치하는 파일이 여러 개 있을 수 있는 경우 배열 솔루션이 더 좋습니다.)