유닉스 범위설정

eu의 이미지

디렉토리 안의 파일 전체:

code-09_00
code-09_20
code-09_40
code-10_00
code-10_20
code-10_40
code-11_00
code-11_20
code-11_40
code-12_00
code-12_20
code-12_40
code-13_00
code-13_20
code-13_40
code-14_00
code-14_20
code-14_40
code-15_00
code-15_20
code-15_40
code-16_00
code-16_20
code-16_40

문제 : 파일 이름 끝 부분이 11_00 에서 14_40 까지인 파일을 나열해라.

-> ls code-[!09-10]* ; ls code-[!15-16]*

이렇게 범위설정을 해서 필요없는 부분을 삭제해주었는데
결과값이 원하는대로 나오지 않습니다.
10이 넘어가면 인식을 못하는건가요 ?
도움 주시면 감사하겠습니다.

ymir의 이미지

ls code-[!09-10]* 에서 [] 는 문자 하나와 매치됩니다 (bash pathname expansion).
이걸 풀어보면 맨 앞에 ! 이 있으므로 모두 !0, !9-1, !0 이 되는거죠.
!0 은 0 을 제외한 문자, 9-1 은 range 인데 순서가 잘못되었으므로 매치되는 문자가 없습니다.
0 은 맨 앞에 ! 이 있으므로, 맨 앞의 !0 과 중복이 됩니다.

[] 에서 range 는 대/소의 개념보다는 012345..ABCDEF..abcde.. 와 같은 순서(ascii 문자열)에서 특정 범위에 해당한다고 생각하시면 좀 더 이해하시기 편할겁니다.
우리는 숫자로 이해하고 썼지만, 실제로는 숫자가 아니라 모두 문자로 취급되어 매치되는거죠.

그래서 code 다음의 두 문자가 숫자 11~14 인 경우라면 다음과 같이 쓰면 됩니다.

$ ls code-1[1-4]_*
$ ls code-1[1234]_*

이런 경우에는 {} 를 쓰면 좀 더 직관적일 수도 있습니다. (숫자 range, array 표현 가능)

$ ls code-{11..14}_*
$ ls code-{11,14,13,12}_*

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

e의 이미지

궁금했던 점이 시원하게 해결되었습니다. 정말 감사합니다 선생님 ㅜㅜ!