OS/Linux

[Linux] 리눅스 find xargs grep 으로 특정 디렉토리 밑에 특정 단어 포함 파일 전체 서칭 하기

MingyuKim 2020. 4. 24.

 Linux find grep 

리눅스 find grep 명령어로 특정 디렉토리 밑에 특정 단어 포함하는 파일 찾기

 

  • 개발을 진행하다 보면, DB server가 변경된다던가, 특정 변수들을 고쳐야 한다던가
  • 특정단어를 포함하는 모든 파일을 서칭해야 할 시기가 있다.
  • 그럴때 find, grep 명령어를 동시에 사용하여 원하는 단어를 포함한 파일 전체를 찾아낼 수 있다.

 

1. find grep 사용방법

 

  • find 는 특정 디렉토리 및 파일을 찾을 때 주로 사용하고
  • grep 은 특정 단어를 검색할 떄 주로 사용한다.
  • 두개를 합쳐서 특정 디렉토리 에 특정한 단어를 포함하는 파일들을 찾을 수 있다.
// /data/ 밑에 타입이 file이고, 192.168.0.1 이라는 단어를 포함하는 파일 전체를 찾기

$ find /data/ -type f | xargs grep -n '192.168.100.1'

  • find /data/ : /data/ 디렉토리 하위 전체중에서
  • -type f : 파일 타입들만 골라서
  • | xargs : 한줄씩 읽어들이고
  • grep -n '192.168.100.1' :  192.168.100.1 이라는 단어를 포함하는 애를 -n(line,줄번호) 까지 출력한다.

 

2. sh를 이용하여 특정 디렉토리 제외하고 원하는 디렉토리만 골라 검색하여 파일로 저장하기

 

  • 서비스되고있는 서버의 경우 백업디렉토리, 이미지 디렉토리 등 용량이 상당한 디렉토리가 있다.
  • 지정한 디렉토리에서 EXCEPTIONS 배열로 검색하지 않을 디렉토리를 지정하여 제외한 후
  • 나머지 원하는 내용을 grep하여 특정 디렉토리 하위에 파일로 토해내서 쉽게 고칠 수 있다.
  • shell 스크립트의 do while문을 사용하여 아래와 같이 sh파일을 작성해보자.
#! /bin/bash

## file path : /data/search_file.sh
## file name : search_file.sh

#exception Dirs
EXCEPTIONS=('backup', 'images', 'img', 'logs', 'test', 'upload_tmp')

ls -l ./  | awk '/^d/{print $NF}' | while read input
do
    if [[ "${EXCEPTIONS[*]}" =~ ${input} ]]; then
        echo ${input} " is exciption dirs "
        continue
    fi
    echo [${input}] 'search start!'

    grep -r "192\.168\.0\.1" ./${input}/ --include=*.{php,inc,html,jsp,asp} > ./search_result_${input}.txt
    
done 
echo 'search End!'

 

  • EXCEPTIONS=('backup', 'images', 'img', 'logs', 'test', 'upload_tmp')
    • 해당 search_file.sh 가 존재하는 /data/ 디렉토리 밑에 있는 하위 디렉토리 중에서
    • search 작업을 하고싶지 않은 디렉토리명을 배열로 지정한다.
  • ls -l ./  | awk '/^d/{print $NF}' | while read input do ~ done
    • 해당 파일이 존재하는 디렉토리 /data/ 하위 디렉토리중 awk 로 필드단위 패턴을 지정하고
    • awk 시스템 변수중 현재 디렉토리의 폴더 개수(현재레코드의 필드개수) 를 나타내는 $NF 변수를 사용.
    • 해당 갯수만큼 read한 하위디렉토리를 input으로 지정하여 do while문을 실행한다.
  • if [[ "${EXCEPTIONS[*]}" =~ ${input} ]]; then fi
    • 위에서 지정한 EXCEIPTIONS 배열 안에, ls -l | awk로 지정된 하위디렉토리 명이 존재할 경우
    • 아래 grep문을 실행하지 않기 위해 continue로 하단 부분을 실행하지 않고
    • 다음 awk print $NF로 넘어가서 while을 작동시킨다.
  • grep -r "192\.168\.0\.1" ./${input}/ --include=*.{php,inc,html,jsp,asp} > ./search_result_${input}.txt
    • 192.168.0.1이 포함된 단어가 while로 돌고있는 /data/ 하위디렉토리 내에 
    • php,inc,html,jsp,asp 확장자로 존재하는 파일에 포함되어 있을 경우
    • 해당 /data/ 디렉토리 바로 밑에 search_result_{while돌고있는 하위디렉토리명}.txt 로 
    • grep한 내용을 출력하여 파일로 토해낸다.

 

 

내용이 유익하셨다면 구독 및 좋아요 클릭 부탁드려요 :)

오늘 하루도 즐거운 하루 보내세요!

 

댓글