ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Ubuntu/Linux] 쉘스크립트 패턴의 모든 것
    IT 2015. 7. 12. 23:48

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

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


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

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


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



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

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


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

       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

Designed by Tistory.