쉘에서 패턴은 굉장히 자주 사용됩니다.
'*'나 '?'를 심심찮게 볼 수 있습니다.
'*'나 '?'를 사용하면,
확정된 하나의 파일이 아닌, 일정조건에 만족하는 다수의 파일을 얻을 수 있습니다.
패턴은 이미 굉장히 널리 알려져있으므로 복습한다는 기분으로 간단하게 정리하겠습니다.
쉘에서 사용하는 패턴은 얼마되지 않습니다.
하나하나 실례를 들어가며 설명하도록 하겠습니다.
- '*' : 현디렉토리의 모든 파일을 의미합니다.
ls를 이용하여 디렉토리에 있는 모든 값을 출력하겠습니다.
ls는 '*'가 옵션으로 들어오면 하위 디렉토리의 내용까지도 보여주세요.
$ ls *
System.map-3.19.0-15-generic config-3.19.0-21-generic memtest86+_multiboot.bin
System.map-3.19.0-21-generic initrd.img-3.19.0-15-generic vmlinuz-3.19.0-15-generic
abi-3.19.0-15-generic initrd.img-3.19.0-21-generic vmlinuz-3.19.0-21-generic
abi-3.19.0-21-generic memtest86+.bin
config-3.19.0-15-generic memtest86+.elf
grub:
fonts gfxblacklist.txt grub.cfg grubenv i386-pc locale unicode.pf2
- '?' : 한글자로 이루어진 파일을 의미합니다.
한글자로 이뤄진 파일이 얼마나될까 싶어 검색해보았습니다.
순식간에 수십개의 파일이 겁출되네요.
$ find . -name '?'
.
./src/linux-headers-3.19.0-21-generic/include/config/arch/dma/addr/t
./src/linux-headers-3.19.0-21-generic/include/config/arch/phys/addr/t
./src/linux-headers-3.19.0-21-generic/include/config/nfs/v4/1
./src/linux-headers-3.19.0-21-generic/include/config/n
./lib/evince/4
./lib/gcc/x86_64-linux-gnu/5
./lib/X11/rstart/contexts/x
./lib/X11/rstart/commands/x
./lib/x86_64-linux-gnu/perl/5.20.2/B
./lib/x86_64-linux-gnu/perl/5.20.2/auto/B
./lib/x86_64-linux-gnu/gconf/2
./lib/indicators3/7
./bin/w
./bin/X
./bin/[
./share/help/C
./share/doc/system-config-samba/C
./share/doc/git/contrib/subtree/t
./share/groff/1.22.3/font/devutf8/R
...
- '??' : 두 글자로 이루어진 파일을 의미합니다.
두 글자로 이뤄진 글자들도 상당히 많습니다.
$ find . -name '??'
./src/linux-headers-3.19.0-21-generic/arch/um
./src/linux-headers-3.19.0-21-generic/arch/x86/um
./src/linux-headers-3.19.0-21-generic/arch/x86/mm
./src/linux-headers-3.19.0-21-generic/arch/sh
./src/linux-headers-3.19.0-21-generic/fs
./src/linux-headers-3.19.0-21-generic/mm
./src/linux-headers-3.19.0-21-generic/include/config/scsi/fc
./src/linux-headers-3.19.0-21-generic/include/config/scsi/3w
./src/linux-headers-3.19.0-21-generic/include/config/scsi/dh
./src/linux-headers-3.19.0-21-generic/include/config/scsi/dh/hp
- '??*' : 두 글자 '이상'으로 이루어진 파일을 의미합니다.
'*'에는 0글자 이상의 글자를 대입할 수 있습니다.
따라서, '??*'로 검색을 해보면 두 글자 미만의 글자는 보이지 않습니다.
$ find . -name '??*'
./src
./src/linux-headers-3.19.0-21-generic
./src/linux-headers-3.19.0-21-generic/.config
./src/linux-headers-3.19.0-21-generic/arch
./src/linux-headers-3.19.0-21-generic/arch/Kconfig
./src/linux-headers-3.19.0-21-generic/arch/mips
./src/linux-headers-3.19.0-21-generic/arch/m68k
...
- '[abcdefg]' : a부터 g까지의 문자 중 '하나'로 이루어진 파일을 의미합니다.
find로 파일을 검색해보면, 한글자이면서 a부터 g까지 중 한 글자 이름으로 된 파일이 잔뜩 나옵니다.
$ find . -name [abcdefg]
./src/linux-headers-3.19.0-21-generic/include/config/can/c
./src/linux-headers-3.19.0-21-generic/include/config/have/c
./src/linux-headers-3.19.0-21-generic/include/config/usb/configfs/f
./src/linux-headers-3.19.0-21-generic/include/config/usb/f
./src/linux-headers-3.19.0-21-generic/include/config/usb/g
./src/linux-headers-3.19.0-15-generic/include/config/can/c
./src/linux-headers-3.19.0-15-generic/include/config/have/c
./src/linux-headers-3.19.0-15-generic/include/config/usb/configfs/f
./src/linux-headers-3.19.0-15-generic/include/config/usb/f
./src/linux-headers-3.19.0-15-generic/include/config/usb/g
- '[gfedcba]' : g부터 a까지의 문자 중 한글자로 이루어진 파일을 의미합니다.
바로 위에 설명한 [abcdefg]와는 순서는 반대이지만 문자는 동일하게 들어가 있습니다.
[] 패턴은 순서는 상관없이 문자의 존재유무만 체크하기 때문에 바로 위의 패턴과는 동일합니다.
- '[a-g]' : '-'기호를 []괄호 안에 써서 범위를 나타낼 수도 있습니다.
바로 위의 두 명령어와 동일하게 a부터 g까지의 문자로 이루어진 파일인지 여부를 체크합니다.
- '[a-cd-g]' : 위와 같이 '-' 기호를 여러번 써도 무방합니다.
위의 세 가지 패턴과 결과는 완전히 동일합니다.
- '[a-zA-Z0-9]' : 첫번째 글자는 영어 소문자 혹은 대문자 혹은 숫자 중의 하나여야 합니다.
특수문자는 첫번째 글자로 받아들일 수 없다는 의지가 엿보입니다.
- '[!a-zA-Z0-9]' : 제일 앞에 '!'가 있으면 반대의미가 됩니다.
영어 대소문자와 숫자를 사용할 수 없게 되었으니 특수기호로 시작하는 파일만 검출됩니다.
$ find . -name '[!a-zA-Z0-9]'
.
./bin/[
- '[a-zA-Z]*' : 영문자로 시작하는 파일이름을 의미합니다.
두번째 글자부터는 무엇이 와도 상관없습니다.
- '?[a-zA-Z]*' : 첫번째 글자는 무엇이와도 상관없습니다.
두번째 글자는 영문 소문자 혹은 대문자여야만 합니다.
세번째 글자는 무엇이 와도 상관없습니다.
- '*[0-9]' : 숫자로 끝나는 파일을 의미합니다.
- '?[0-9]' : 두 글자로 이뤄진 파일을 의미합니다.
단, 마지막 글자는 숫자여야만 합니다.
- '*.[0-9]' : 마지막 글자는 숫자여야합니다.
단, 숫자 앞에는 '.'이 있어야 합니다.
이상으로 간단하게 패턴을 알아보았습니다.
그럼 좋은 하루 보내세요~
끝_
* References
'IT' 카테고리의 다른 글
[Ubuntu/Linux] ssh 공개키의 모든 것 (96) | 2015.07.19 |
---|---|
[Ubuntu/Linux] 자바(Java, JRE 1.8.0) - 톰캣8(tomcat8) - OpenGrok 연결하기 (30) | 2015.07.18 |
[Ubuntu/Linux] 쉘스크립트 expr의 모든 것 (4) | 2015.07.15 |
[Ubuntu/Linux] 쉘스크립트 변수의 모든 것 (0) | 2015.07.14 |
[Ubuntu/Linux] 쉘스크립트 인용부호의 모든 것 (30) | 2015.07.13 |
[Ubuntu/Linux] 쉘스크립트 test 명령문의 모든 것 (0) | 2015.07.11 |
[Ubuntu/Linux] 쉘스크립트 Flow control - for, case 문법의 모든 것 (0) | 2015.07.10 |
[Ubuntu/Linux] 쉘스크립트 Flow control - while, until 문법의 모든 것 (0) | 2015.07.09 |
[Ubuntu/Linux] 쉘스크립트 Flow control - if 문법의 모든 것 (0) | 2015.07.08 |
[Ubuntu/Linux] 본쉘(Bourne shell)에 없는 것과 있는 것 (0) | 2015.07.06 |