0

不足しているファイルを見つけるプロセスを自動化するために、次の bash スクリプトを作成しました。

echo "--|";
echo "  |";
read -p "  ->Enter the text file that contains the video files to look for: " fname
if [ ! -e "$fname" ]; then
        echo "  |";
        echo "--> The file $fname is not valid or doesn't exist";
else
        echo "  |";
        read -p "  ->File ready to be processed, enter the path where to look for the files: [/home/efeikuna/public_html/files/flv/]": path
        if [ ! -e "$path" ]; then
                path="/home/efeikuna/public_html/files/flv/";
        fi
                i=0
                for line in `cat $fname`;
                do
                        file=$path$line;
                        #echo "   |";
                        if [ ! -e $file ]; then
                                echo "   -> $i - $file => DOES NOT EXIST";
                        fi
                        i=$(expr $i + 1);
                        #if [ $i == 3 ]; then
                        #       break;
                        #fi
                done
fi

スクリプトは機能していますが、さらにいくつかの機能が必要なので、正しい方法を案内/指摘できることを願っていました:

  • 存在しないファイルの総数と既存のファイルの数を取得する必要があります
  • ファイルの整合性をチェックするために何を使用することをお勧めしますか (通常は flv ファイルと txt ファイルですが、将来的にはその他になります)
  • if [ ! -e $file ]入った場合、ファイルが他の場所に存在するかどうかを確認するためにどうすれば と一致$fnameさせることができlocate $fnameますか? locate $fnametrue を返す場合は、場所を表示し、そうでない場合は続行します。
  • 既存のファイルと不足しているファイルを別々に示すファイルを作成するために使用することをお勧めします。例:

    Found Files:
    ____________
       ---- asdasd.flv
       ---- asdasd1.flv
       ---- asdasd2.flv
       ---- asdasd3.flv
       ---- asdasd4.flv
    
    Missing Files:
    ____________
       ---- bsdasd.flv
       ---- bsdasd1.flv
       ---- bsdasd2.flv
       ---- bsdasd3.flv
       ---- bsdasd4.flv
    
  • 可能な改善はありますか?

誤解の可能性がある場合は、ありがとうございます。

4

2 に答える 2

1

md5sum(およびsha1sum) チェックサムを含むファイルを生成します。チェックサムを含むファイルに対して実行した結果を解析するだけmd5sum -cで、有効、無効、または欠落しているファイルの数を確認できます。

于 2012-04-17T18:07:34.043 に答える
1

.存在しないファイルの総数と既存のファイルの数を取得する必要があります。 これにより、bash の代わりに python を使用します。実際には bash で実行できますが、この目的には python の方が効率的であることがわかりました。

 #!/usr/bin/env python

 import os
 import sys

 def check_file(directory, filelist):
     is_file = []
     not_file = []
     with open(filelist) as f:
         for filename in f:
             fp = directory + '/' + filename.strip()
             print fp
             if os.path.isfile(fp): is_file.append(filename.strip())
             else: not_file.append(filename.strip())
     print "Number of file: %s" %(len(is_file))
     for item in is_file: print "----- %s" %(item)
     print "Number of non file: %s" %(len(not_file))
     for item in not_file: print "----- %s" %(item)

 if __name__ == '__main__':
     if len(sys.argv) < 3:
         print "Usage: %s [dir] [listfile]" %(sys.argv[0])
         sys.exit(2)
     directory = sys.argv[1]
     filelist  = sys.argv[2]
     check_file(directory, filelist)

ファイルの整合性をチェックするために何を使用することをお勧めしますか (通常は flv ファイルと txt ファイルですが、将来的には他のものになる予定です)

md5sum は正しい方法ですが、より多くの大きなファイルがある場合は非常に遅くなる可能性があります。代わりにinotifyを使用してください。inotify を使用すると、ファイルが更新されたときに通知されます。

もし[!-e $file ] が入りますが、ファイルが他の場所に存在するかどうかを確認するために、 $fname を $fname と一致させるにはどうすればよいですか? locate $fname が true を返す場合は、その場所を表示し、そうでない場合は続行します。

これが別のpythonの方法です:

for path, dirs, files in os.walk(directory):
     for f in [os.path.abspath(os.path.join(path, filename)) for filename in files]:
         fn = filename.split['/'][-1]
         if fn == file_you_want_to_search_for:
             print filename 

この助けを願っています。

于 2012-04-18T11:19:01.840 に答える