如何编写UNIX脚本以检查目录是否包含指定数量的文件

时间:2015-12-16 17:19:48

标签: shell unix scripting

我的基本目录有4个目录:Dir1 Dir2 Dir3 Dir4。每个目录都有以下格式的文件:"Sometext_YYYMMMDD"。我正在编写一个UNIX脚本来搜索所有这些目录中具有特定字符串“20151215”的文件,然后将其打印在控制台上。

find . -name "*20151215" -print

文件示例:File1_20151215(将打印); File2_20151214(不会打印)

我想编写一个运行这些目录的脚本,并检查Dir1是否包含4个字符串为“20151215”的文件,Dir2包含3个字符串为“20151215”的文件和Dir3& Dir4包含4个字符串“20151215”的文件。如果目录中没有包含该字符串的文件数,那么我想打印这些目录。

我该怎么做?请帮忙!

更新:我对此有一个补充:还有一些文件格式不是"Sometext_YYYMMMDD"所以,对于那些我使用过的文件:

find . -name "FILENAME*" -mtime -1 -exec ls -ltr '{}' \;

提取创建该文件时的时间戳。但是,我想知道如何将其添加到脚本中,以便如果时间戳是2015年12月15日,那么此文件也应该在搜索中计算?

1 个答案:

答案 0 :(得分:1)

你有查找部分,但现在需要计算与模式匹配的文件数量。由于find每次匹配打印一行到输出,您可以使用“wc -l”来计算有多少行。将其分配给变量,您可以在比较中使用,并且您有90%的变量。 E.g。

check_dir () {
  d1=$(find $1 -name "*$2*" | wc -l)
  if [ $d1 != $3 ]; then echo $1 ; fi
}

check_dir ./dir1 20151215 4
check_dir ./dir2 20151215 3

对于额外的功劳,您可以想象将其转换为输入

的功能
  1. 要搜索的目录
  2. 要匹配的文件名模式
  3. 期待多少场比赛
  4. 看起来像是:

    check_dir () {
      d1=$2
      d2=$((d1+1))
      n=$(find $1 \( -name "*$d1*" \) -o \( -newermt $d1 ! -newermt $d2 \) | wc -l)
      if [ $n != $3 ]; then echo $1 ; fi
    }
    
    check_dir ./dir1 20151215 4
    check_dir ./dir2 20151215 3
    

    更新:根据文件名或最后修改(无法创建)查找文件的新要求,这里有两种方法:

    第一个使用相当现代的find功能,并非在所有版本中都可用,newermt:

    \( -name "*$2*" \)    # Matches filenames that contain 20151215
    
    -o                    # Or
    
    \( -newermt $d1 ! -newermt $d2 \)
    

    这看起来有点混乱,但将其分解为小步骤,这是有道理的:

    1. d1 = $ 2#所以d1 = 20151215
    2. d2 = $((d1 + 1))#d2 = 20151216(幸运的是你这样指定日期格式!)
    3. find命令现在有两个谓词,根据文件名或修改时间进行匹配:
    4. #!/bin/bash
      check_dir () {
        d1=$2
        d2=$((d1+1))
        f1=`mktemp`
        f2=`mktemp`
        touch -d $d1 $f1
        touch -d $d2 $f2
        n=$(find $1 \( -name "*$d1*" \) -o \( -newer $f1 ! -newer $f2 \) | wc -l)
        if [ $n != $3 ]; then echo $1 "=" $n ; fi
        rm -f $f1 $f2
      }
      
           

      修改时间大于第一天的午夜,且不超过第二天的午夜

      第二种方法使用几个临时文件,并使用touch命令的-d选项设置它们的时间戳

      from django.db import models
      
      class Widget(models.Model):
          # ...
          description_1 = models.CharField(max_length=255)
          description_2 = models.CharField(max_length=255)
          description_3 = models.CharField(max_length=255)
          # ...
      

      同样,幸运的是日期是YYYYMMDD,因为它与touch命令的-d选项一起使用。如果没有,您需要进行一些字符串操作,以便将日期转换为“touch -t”的正确格式。