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

 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한 내용을 출력하여 파일로 토해낸다.

 

 

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

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