번호가 매겨진 데이터 파일이 포함된 폴더가 있습니다. 미리 정의된 파일 범위를 단계별로 추출하려고 합니다. 내가 찾고 있는 파일 범위는 코드가 실행됨에 따라 변경되는 ns와 ne라는 두 변수에 미리 정의되어 있습니다.
나는 다음과 같은 것을 시도해 왔습니다.
$ ns=0001
$ ne=0030
$ ls foo_{$ns..$ne}.nc
{$ns..$ne}
그러나 이는 시퀀스로 읽히지 않으며 오류를 반환합니다.
ls: cannot access foo_{0001..0030}.nc: No such file or directory
동일한 명령을 입력하고 숫자를 수동으로 입력하면 예상대로 0001에서 0030 사이의 숫자가 포함된 파일 목록이 표시됩니다.
나는 시퀀싱을 사용하여 기본적인 실수를 하고 있다고 생각하는데, 누군가가 실수가 무엇인지 말해줬으면 합니다.
매우 감사합니다.
답변1
중괄호 확장은 변수 확장 전에 발생하므로 그 안에서 변수를 사용할 수 없습니다. 당신은 그것을 사용할 수 있습니다 seq
:
seq -f foo_%03.0f.nc $ns $ne
답변2
이는 {1..20}
와일드카드/와일드카드 연산자가 아닙니다. 이것은 및 에 의해 소개되고 복사된 특별한 형태의 버팀대 확장이지만 zsh
제한 사항과 ksh93
변경 사항이 있습니다 bash
.
foo_{0001..0030}.nc
일치하는 파일 목록으로 확장되지 않으며 파일 존재 여부에 관계없이 foo_0001.nc
, foo_0002.nc
, ... 로 확장됩니다.foo_0030.nc
bash
내용을 변경할 수 없다는 제한이 있습니다. ksh93
그리고 zsh
그러한 제한은 없습니다.
따라서 ls -d foo_{$ns..$ne}.nc
이 쉘에서도 작동합니다.
zsh
십진수 범위와 일치시키는 와일드카드/와일드카드 연산자도 있습니다.
ls -d foo_<1-30>.nc
일치하는 파일 목록으로 확장됩니다. 4자리 0 패딩 숫자로 제한하려면 다른 연산자가 필요합니다.
ls -d foo_(<1-30>~^????).nc # needs extendedglob
( ~
예와는 별개로(설마), ^
예아니요,역시 ~^
이렇습니다치 페이 페이, 그래서그리고).
하지만 이 연산자는 변수와 함께 작동하지 않습니다 (리디렉션 연산자와 겹치기 때문에 가능한 한 리디렉션과의 충돌을 피하기 위해 <x-y>
패턴을 따를 때만 작동합니다 ). <[digits]-[digits]>
그러나 다음 구문을 사용하여 문제를 해결할 수 있습니다.
ls -d ${~:-foo_<$ns-$ne>.nc}
또는 좀 더 명확하게 말하면 다음과 같습니다.
pattern="foo_<$ns-$ne>.nc"
ls -d $~pattern