본문 바로가기

IT

[Ubuntu/Linux] 쉘스크립트 패턴의 모든 것

쉘에서 패턴은 굉장히 자주 사용됩니다.

'*'나 '?'를 심심찮게 볼 수 있습니다.


'*'나 '?'를 사용하면,

확정된 하나의 파일이 아닌, 일정조건에 만족하는 다수의 파일을 얻을 수 있습니다.


패턴은 이미 굉장히 널리 알려져있으므로 복습한다는 기분으로 간단하게 정리하겠습니다.



쉘에서 사용하는 패턴은 얼마되지 않습니다.

하나하나 실례를 들어가며 설명하도록 하겠습니다.


- '*' : 현디렉토리의 모든 파일을 의미합니다.

   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

http://www.grymoire.com/Unix/Sh.html#uh-9