获取不存在的文件数

时间:2012-04-17 18:04:59

标签: linux bash shell

我编写了这个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 ]输入,我如何才能将$fnamelocate $fname匹配,以查看该文件是否存在于其他位置?如果locate $fname返回true,则显示位于何处,如果不是,则继续。
  • 您建议使用什么来编写一个文件,它分别表示现有文件和缺失文件,例如:

    Found Files:
    ____________
       ---- asdasd.flv
       ---- asdasd1.flv
       ---- asdasd2.flv
       ---- asdasd3.flv
       ---- asdasd4.flv
    
    Missing Files:
    ____________
       ---- bsdasd.flv
       ---- bsdasd1.flv
       ---- bsdasd2.flv
       ---- bsdasd3.flv
       ---- bsdasd4.flv
    
  • 有任何可能的改进吗?

感谢并抱歉任何可能的误解

2 个答案:

答案 0 :(得分:1)

md5sum(和sha1sum)生成一个包含校验和的文件。只需针对包含校验和的文件解析运行md5sum -c的结果,即可查看有效,无效或缺失的文件数。

答案 1 :(得分:1)

。我需要获取现有文件的总数和现有文件的数量 有了这个,我使用python而不是bash,实际上它可以用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,您将在文件更新时收到通知。

若if [! -e $ file]进入,如何将$ fname与locate $ fname匹配,以查看该文件是否存在于其他地方?如果找到$ fname返回true,则显示where where where,如果不是,则继续。

这是另一种蟒蛇方式:

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 

希望这有帮助。