bash script2023. 4. 7. 17:27

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/533550

 

find 명령을 이용한 파일/디렉토리 검색은 매우 편리하지만, 검색을 수행하는 위치에 디렉토리와 파일 수가 상당히 많을 경우 속도가 꽤 느려지기도 한다. (find 명령의 기본적인 사용법은 이전 게시물을 참고하자. 여기로)

예를 들어 NFS로 연결된 디렉토리인데 파일이 수천개가 있고 여기서 find 명령을 반복적으로 수행해야 할 경우엔 의외로 시간이 상당히 소요될 수도 있다.

아래의 예시를 보자. file_list.txt 파일에 있는 파일 목록을 보고 ~/files 디렉토리에 같은 이름의 파일이 있는지 검색하는 경우이다. file_list.txt 파일의 내용은 아래와 같이 생겼다고 하자.

# file_list.txt 내용 확인
cat file_list.txt
my_file1.dat
my_file2.dat
...

이제 for 반복문을 이용해서 ~/files 디렉토리 안에 my_file1.dat 등 목록 파일에 저장된 파일명과 일치하는 것들이 있는지 확인한다. 색인 없이 그냥 만든 스크립트는 아래와 같다.

for file in `cat file_list.txt`
do
  # find 명령과 grep 명령으로 $file 변수값에 제시된 문자열과 일치하는 파일명 검색
  file_chk=`find ~/files -type f | grep "/$file$" | wc -l`
  if [[ $file_chk -ge 1 ]]
    then echo "~/files 디렉토리 하위에서 $file 파일을 발견! (일치하는 파일 개수: $file_chk)"
  fi
done

위의 예시에서 file_list.txt에 포함된 파일명이 100개 정도 되고, ~/files 디렉토리가 NFS로 연결되어 있으면서 안에 있는 파일이 수천개가 되면 위의 스크립트는 생각보다 시간이 꽤 걸린다.

이런 문제를 해결하기 위해 리눅스에서 기본적으로 제공하는 램(RAM) 디스크 영역인 /dev/shm 디렉토리에 임시로 색인을 만들어 보자. (/dev/shm 디렉토리에 대한 내용은 이전 게시물을 참고하자. 여기로)

/dev/shm 디렉토리에 mktemp 명령으로 임시 디렉토리를 만들고 그 안에 색인을 저장하자. (mktemp 명령에 대한 내용은 이전 게시물을 참고하자. 여기로)

이제 find 명령으로 색인을 만들고, 실제 검색할 때는 색인 파일을 cat 명령으로 열어서 검색하면 된다.

아래의 스크립트와 같은 형태로 만들면 되겠다.

# 램디스크 영역(/dev/shm)에 임시 디렉토리 만들기
tmp_dir=`mktemp -d /dev/shm/index_dir_XXXX`

# 색인 파일 file_index.idx 생성
find ~/files -type f > $tmp_dir/file_index.idx
# find 명령 대신 색인 파일에 대한 cat 명령으로 검색 수행
for file in `cat file_list.txt`
do
  # 색인 파일에서 $file 변수값에 제시된 문자열과 일치하는 파일명 검색
  file_chk=`cat $tmp_dir/file_index.idx | grep "/$file$" | wc -l`
  if [[ $file_chk -ge 1 ]]
    then echo "~/files 디렉토리 하위에서 $file 파일을 발견! (일치하는 파일 개수: $file_chk)"
  fi  
done
# 검색 종료. 임시 디렉토리 삭제
rm -r $tmp_dir

특정 디렉토리에 대해서 find 명령을 이용한 반복적인 검색을 해야 할 경우 위와 같은 방식을 사용하면 속도가 대폭 향상된다.

 

 

728x90
Posted by 반달가면