よりよく効率的な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と比較して画像を見つけることができます。いいえ使用される。

おすすめ記事