더 좋고 효율적인 bash 스크립트(grep)

더 좋고 효율적인 bash 스크립트(grep)

제가 작성한 스크립트가 있습니다. 완벽하게 실행됩니다. 하지만 실행하는 데 4일이 걸릴 것으로 예상됩니다! 이 작업을 수행하는 더 효율적인 방법이 있는지 궁금합니다.

스크립트는 다음을 수행합니다.

  1. 이미지 서버에서 모든 파일을 가져와서 로드합니다.이미지서버.txt
  2. grep의 파일 경로 형식을 지정합니다.
  3. 순환하다이미지서버.txt그리고 /var/www/html각 줄마다 grep
  4. 나중에 사용할 수 있도록 2개의 형식화된(기존 및 존재하지 않는) 파일 작성
  5. tail스크립트 진행 상황을 추적하기 위해 로그 파일에 쓰기


2개의 파일이 있습니다.

  1. 이미지서버.txt (약 250,000라인)

    imageserver/icons/socialmedia/sqcolor_tumblr.png
    imageserver/icons/socialmedia/sqcolor_gaf.png
    imageserver/icons/socialmedia/sqcolor_yelp.png
    imageserver/icons/socialmedia/sqcolor_linkedin.png
    imageserver/icons/socialmedia/sqcolor_twitter.png
    imageserver/icons/socialmedia/sqcolor_angies.png
    imageserver/icons/socialmedia/sqcolor_houzz.png
    
  2. search.sh

    #!/bin/bash
    
    echo "\n\n Started ...\n\n"
    
    # Clear Runtime Files
    > doesExist.txt
    > nonExists.txt
    > imgSearch.log
    
    echo "\n\n Building Image List ...\n\n"
    
    #write contents of imageserver to imageserver.txt
    find /var/www/imageserver/ -type f > imageserver.txt
    
    # Remove /var/www
    find ./imageserver.txt -type f -readable -writable -exec sed -i "s/\/var\/www\///g" {} \;
    echo "\n\n Finished Building Start Searching ...\n\n"
    
    linecount=$(wc -l < ./imageserver.txt)
    
    while IFS= read -r var
    do
    echo "$linecount\n\n"
    echo "\n ... Searching $var\n "
    
    results=$(grep -rl "$var" /var/www/html)
    if [ $? -eq 0 ]; then
        echo "Image exists ...\n"
        echo "$var|||$results^^^" >> doesExist.txt
        echo "$linecount | YES | $var " >> imgSearch.log
    else
        echo "Image does not exist ... \n"
        echo $var >> nonExists.txt
        echo "$linecount | NO | $var " >> imgSearch.log
    fi
    
    linecount=$((linecount-1))
    done < ./imageserver.txt
    
    echo "\n\n -- FINISHED -- \n\n"
    

기본적으로 이미지가 /var/www/html디렉토리의 HTML과 함께 사용되는지 확인하고 있습니다.

즉, 각 반복에는 grep약 0.5~1초가 소요됩니다. 제 계산으로는 3~4일이 소요됩니다. 비록 예외적인 일이라고 생각하지만.. 이를 달성할 수 있는 더 나은(더 효율적인) 방법이 있나요?

답변1

스크립트의 성능은 문제가 되지 않습니다.

당신은 더듬고 있습니다/var/www/html에서 검색하세요.250,000이류!

while 루프를 다음으로 바꿔야 합니다.

grep -rl -F -f ./imageserver.txt /var/www/html > grep_output

그런 다음 출력 파일을 구문 분석하여 통계를 얻습니다. 까다롭기는 하지만 4일은 걸리지 않습니다.

아니면 어쩌면 간단할지도

grep -Ff ./imageserver.txt -o grep_output | sort -u

사용된 이미지 목록을 가져옵니다. commimageserver.txt와 비교하여 이미지를 찾을 수 있습니다.아니요사용된.

관련 정보