5. find 사용

UNIX&LINUX/LINUX 2014. 5. 13. 18:34
728x90
반응형
 

저의 실행과정을 기록하고자 이렇게 적어봅니다 (__) (--) 꾸벅

고수님들은 초심자로 돌아가는 마음으로 보시고???

저처럼 처음 다뤄본 분들은 같이해요^^히~

먼저 정리한 것 입니다(__)(--) 꾸벅

 

5. find 사용 

 

 

 

폴더에서 파일을 찾을 때 쉽게 사용할 수 있는 명령 중에 find가 있습니다. 물론 이 명령도 여러 가지 복잡한 사용 방법이 있지만 그러한 사용 방법을 모두 알지 못하더라도 매우 쉽게 사용할 수 있는 방법이 있습니다.

 

 

yhoh@ubuntu:~$ find -name "fileName" -exec grep wantPattern {} \; -print

 

 

바로 위와 같은 명령으로 사용하면 됩니다. "find ."으로 현재 폴더부터 시작해서 그 하위의 모든 폴더를 검색해서 찾아주게 됩니다. (물론 시스템에 따라서는 점을 생략하더라도 기본적으로 디폴트로 현재 디렉토리부터 시작해서 하위 폴더를 찾을 수도 있습니다.)

 

 

-name의 다음에 ""의 안에 검색을 원하는 파일의 이름을 채워주면 됩니다. 만약 txt라는 확장자만을 가지는 파일을 검사할 것이면 "*.txt"로 해주면 됩니다. -exec을 통해서 수행시키는 프로그램은 이전에 살펴본 grep입니다. grep의 다음에 원하는 패턴에 대한 것을 입력해 주면 됩니다.

 

 

yhoh@ubuntu:~$ find -name “*.mk" -exec grep clean {} \; -print

 

 

위의 예제는 mk라는 확장자를 가지는 모든 파일에서 clean이라는 문자열을 찾아서 출력을 해주는 것입니다. 한가지 실제 예를 들어서 수행을 해보도록 하겠습니다.

 

 

 

 

 

 

find -name *.desktop -exec grep --color=auto Ex {} \; -print

 

 

위 내용을 수행한 것입니다. 문자열을 찾기 위해서 사용하는 grep에 컬러 옵션을 주어서 수행시키면 결과에 색깔이 들어가기 때문에 보다 더 인식하기 쉬워집니다.

 

 

이전에는 grep을 그냥 사용했어도 컬러가 들어 갔었는데 이번에는 반드시 그 옵션을 주어야만 컬러가 표시됩니다. 이는 이전에 grep을 사용할 때는 .bashrc 파일을 통해서 alias되었던 grep을 사용하게 되는 것이고, 이번에는 직접 grep이라는 실행 파일을 exec을 통해서 실행시키고 있기 때문입니다.

 

 

그런데 위 결과를 보면 아무런 문제가 없이 느껴지지만 한가지 주의할 점이 있습니다. 위 결과는 현재 폴더에서만 결과를 찾은 것을 알 수 있습니다.

 

 

 

 

find -name '*.desktop' -exec grep --color=auto Ex {} \; -print

 

 

이전에 수행했던 것과 달라진 것은 단순히 원하는 파일의 종류를 지정하는 부분에 Quote 기호를 넣은 것뿐입니다. 그런데 이번에는 현재 폴더의 하위에 있는 모든 폴더를 검색해서 결과를 찾고 있는 것입니다.

 

 

find -name "*.desktop" -exec grep --color=auto Ex {} \; -print

 

 

위와 같이 Sigle Quote가 아닌 Double Quote 기호를 사용해도 결과는 동일하게 나옵니다.

 

 

Find 명령의 –name 옵션에 주어지는 부분에 모든 파일을 검색하기 위해서 넣어주는 방법의 기본은 single quotes 안에 해당하는 문자를 넣어주는 것입니다. 위의 예에서처럼 *를 이용해서 모든 문자를 포함할 수 있도록 하는 방법을 정확하게 사용하기 위해서는 Quotes를 반드시 이용해야 합니다. 그렇지만 사용하는 리눅스의 환경에 따라서는 꼭 이러한 Quote를 이용하지 않더라도 자동으로 될 수 있도록 되는 경우도 있습니다.

 

 

yhoh@ubuntu:~$ find -name "*.mk" -exec grep clean {} \; -print >> result.txt

 

 

>>를 통해서 result.txt라는 파일을 만들어서 거기에 결과를 저장하게 할 수도 있습니다.

 

 

위 명령의 내용은 사실 머리로 기억을 해서 사용하기에는 너무 복잡합니다. 물론 리눅스를 엄청 능수능란하게 다루시는 분들은 find를 얼마나 잘 다루는가만 봐도 수준을 알 수 있다고 말씀하시지만 사실 평범한 사람들에게 위 내용은 너무 복잡합니다.

 

 

#!/bin/bash

 

LC_ALL="C"

 

if [ "$1" != "" ] && [ "$2" != "" ]; then

 

        find . -name "$1" -exec grep --color=auto "$2" {} \; -print

 

else

 

        echo "Usage: $0 *.* abcd"

 

        exit 1

 

fi

 

 

 

 

 

 

 

 

 

 

 

 

위와 같이 단순한 스크립트를 하나 만들 수 있습니다. 그리고 그 이름을 myfind라고 지정하고 이것을 ~/bin에 복사해 두었습니다. 내용은 단순합니다. 위에서 배운 그 명령을 그대로 이용하는데 다만 파라미터를 두 개 받아서 처리하도록 만든 것입니다.(뛰어쓰기 잘해야합니다.)

 

 

 

 

위와 같이 만들어진 스크립트 파일을 chmod 명령을 이용해서 실행 모드가 추가되도록 해주어야 합니다. 혹시라도 몰라서 헤매는 분이 계실까봐 노파심에 말씀 드립니다.

 

 

PATH=/home/yhoh/bin:$PATH

 

 

 

 

당연히 위 내용이 ".bashrc"에 정의되어 있어야 할 것입니다. myfind라는 명령이 ~/bin에 존재하기 때문에 Path 설정이 되어야 합니다.

 

 

yhoh@ubuntu:~$ myfind *.desktop Ex

Name=Examples

Comment=Example content for Ubuntu

./examples.desktop

yhoh@ubuntu:~$ myfind '*.desktop' Ex

TryExec=gnome-terminal

Exec=gnome-terminal

./Desktop/gnome-terminal.desktop

 

Name=Examples

Comment=Example content for Ubuntu

./examples.desktop

 

 

 

 

 

"myfind *.desktop Ex"라고 입력해 보았습니다. 이전에 수행했던 결과와 동일하게 현재 폴더에서만 내용을 찾아서 출력하고 있습니다. Single Quote를 이용해서 다시 수행했을 때 하위 폴더까지 모두 검사해서 결과를 출력하고 있습니다. 이제는 매우 쉽게 find 명령을 사용할 수 있게 되었습니다.

 

 

yhoh@ubuntu:~$ myfind '*' Ex

 

 

‘.desktop’으로 끝나는 파일 뿐만 아니라 모든 파일에서 찾고 싶을 경우는 위와 같이 ‘*’를 입력해서 사용하면 됩니다. 이렇게 사용하는 방법도 있고 아래와 같이 따로 스크립트를 만들어서 사용할 수도 있습니다.

 

 

#!/bin/bash

LC_ALL="C"

if [ "$1" != "" ] ; then

        find . -exec grep --color=auto "$1" {} \; -print

 

else

        echo "Usage: $0 abcd"

        exit 1

fi

 

 

 

 

 

위 내용은 myfindAll이라는 스크립트 파일입니다. –name 옵션이 빠져 있습니다.

 

 

yhoh@ubuntu:~$ myfindAll Ex

 

 

어떤 특정 확장자를 가진 파일 등과 같이 파일에 대한 부분을 없애버림으로써 모든 파일에서 특정 패턴을 찾도록 한 것입니다. 이제는 이 스크립트만 이용해서 원하는 패턴만 입력하면 되는 것입니다.

 

 

파일 내에 존재하는 어떤 패턴을 찾을 때는 위에서 살펴본 것을 이용하면 됩니다. 하지만 만약 파일 이름에 어떤 글자가 포함된 내용을 찾을 때는 위 내용에서 grep이 없이 수행을 하면 됩니다. 이 내용으로 myfindName이라는 것으로 스크립트 파일을 하나 더 만들었습니다.

 

 

#!/bin/bash

LC_ALL="C"

if [ "$1" != "" ] ; then

        find . -name "*$1*" -print

 

else

        echo "Usage: $0 abcd"

        exit 1

fi

 

 

 

 

 

내용은 무척 단순합니다. find 명령으로 –name–print만을 이용해서 넘겨진 파라미터를 포함하는 모든 파일 이름을 출력해 주는 것입니다.

 

 

yhoh@ubuntu:~$ myfindName des

 

./Desktop/gnome-terminal.desktop

./examples.desktop

./.gconf/apps/panel/applets/show_desktop_button_screen0

./.gconf/apps/nautilus/desktop-metadata

./.gconf/desktop

 

 

 

des라는 것이 포함된 것을 찾는 것입니다. 위와 같이 모든 파일들이 검색되는 것을 확인할 수 있습니다.

 

 

 

 

위와 같은 방법으로 단순한 find 명령을 통해서 나오는 결과에서 파이프라인으로 결과를 받아서 grep을 통해 찾을 수도 있습니다. 그러나 이럴 경우 어떤 폴더 이름에 원하는 문자열이 있을 경우에 너무 많은 결과가 나타나는 단점이 있을 수 있습니다.

 

 

#!/bin/bash

LC_ALL="C"

if [ "$1" != "" ] ; then

        find . -name "*$1*" –print | grep --color=auto "$1"

 

else

        echo "Usage: $0 abcd"

        exit 1

fi

 

 

 

 

 

위와 같이 결과에 파이프라인을 주어서 grep으로 다시 한번 컬러를 주어서 검색해 주면 결과로 나오는 내용이 읽기 편하게 될 것입니다.

 

 

위에서 사용했던 스크립트 파일들을 보면 문법을 사실 잘 모른다고 하더라도 대부분의 내용은 아 이렇겠거니 유추할 수 있습니다. 하지만 맨 앞의 두 문장은 무슨 뜻일지 잘 모르시는 분들도 있을 것 같아 설명을 드리고자 합니다. 위의 예제 스크립트들은 사실 이 두 문장이 없어도 동작에는 아무런 차이가 없습니다.

 

 

#!/bin/bash

 

 

 

 

위의 첫 문장은 앞으로 나올 쉘 명령어들을 어느 쉘에서 수행할 것인지를 알려주는 것입니다. 대부분의 쉘 프로그램들은 아주 특수한 몇몇 명령어를 제외하면 대부분이 동일한 기능을 가지고 있습니다. 하지만 특별히 어느 쉘에서만 사용되는 명령을 수행한다면 실제 이 쉘 스크립트를 수행시키는 쉘이 어떤 것이든지 수행될 수 있도록 하기 위해서 위 문장을 수행시키는 것입니다. 우리는 bash을 사용하고 있고 여기서 수행이 되도록 설정하였습니다.

 

 

LC_ALL="C"

 

 

 

 

스크립트 프로그램 내에서 grep을 이용해서 어떤 문자열을 찾을 것입니다. 그런데 이때 출력되는 문장이 Locale에 따라서 다르게 되면 결과가 달라질 수 있기 때문에 가장 처음에 이 문장을 수행해서 디폴트 상태인 C library에서 지원되는 영어로 바꾸어 준다는 의미입니다.

 

 

 

저의 실행 과정 입니다^^

find...길더군요ㅠㅠ;;;;;

하지만 힘내서 나가기로했습니다~!!(아직 갈길이 멀었음;;)

역시 여기도 뛰어쓰기를 잘해야 되더군요^^;;;;

myfind를 만들라기에 열심이 gedit로 만들고 저장을했습니다^^

bin폴더에 저장하는순간^^??

사용권한이없다더군요;;;ㅎㄷㄷㄷㄷㄷㄷㄷㄷㄷ;;;;;

<사용권한 설정은이다음에 올리겠습니다(__)(--)꾸벅>

사용권한 설정을 배우고나니 한결 쉽더군요^____^씨익

그리고 myfind *.desktop Ex

이렇게 하였는데... 에러가 뜨더군요.... 역시 gedit부분도 뛰어쓰기와 대소문자 구별을 잘 해야 하더군요;;;

수정에 수정을 거처서 드디어^^ find 를 끝냈습니다 ^____________^씨익

 

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,