Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何编写UNIX脚本来检查目录是否包含指定数量的文件_Shell_Unix_Scripting - Fatal编程技术网

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

Shell 如何编写UNIX脚本来检查目录是否包含指定数量的文件,shell,unix,scripting,Shell,Unix,Scripting,我有一个基本目录,它有4个目录:Dir1 Dir2 Dir3 Dir4。每个目录都有以下格式的文件:“Sometext\u yyymmdd”。我正在编写一个UNIX脚本来搜索所有这些目录中的文件,这些目录都有一个特定的字符串,比如“20151215”,然后在控制台上打印它 find . -name "*20151215" -print 文件示例:File1\u 20151215(将打印此文件); 文件2\u 20151214(将不打印此文件) 我想编写一个脚本,在这些目录中运行,并检查Dir1

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

find . -name "*20151215" -print
文件示例:
File1\u 20151215
(将打印此文件);
文件2\u 20151214
(将不打印此文件)

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

我该怎么做?请帮忙

更新:我还有一个补充:还有一些文件的格式不是
“Sometext\u yyymmdd”
,因此,对于这些文件,我使用了如下内容:

find-名称“FILENAME*”-mtime-1-exec ls-ltr'{}'\


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

您获得了“查找”部分,但现在需要计算与该模式匹配的文件数。因为find在输出的每个匹配中打印一行,所以可以使用“wc-l”来计算有多少行。把它分配给一个变量,你可以在比较中使用它,你就完成了90%。例如

d1=$(find ./dir1 -name '*20151215*' | wc -l)
if [ $d1 != 4 ]; then echo "dir1" ; fi
为了获得额外的积分,您可以想象将其转换为具有

  • 要搜索的目录
  • 要匹配的文件名模式
  • 预计会有多少场比赛
  • 这看起来像:

    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
    
    更新:新的要求是根据文件名或上次修改(无法创建)查找文件,这里有两种方法:

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

    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
    
    这看起来有点让人困惑,但把它分解成几个小步骤,它是有意义的:

  • d1=2美元,因此d1=20151215
  • d2=$((d1+1))#d2=20151216(幸运的是,您这样指定了日期格式!)
  • find命令现在有两个谓词,根据文件名或修改时间进行匹配:
  • 修改时间第一天大于午夜,第二天不大于午夜

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

    #!/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
    }
    

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

    如果文件名包含换行符,该怎么办?唉,让我们问问OP这有多大可能;-)如果可能,那么-print0 | xargs-0-i“echo aaa”| wc-l@IanMcGowan当前位置我刚刚更新了我的问题。文件名还有一些我以前没有意识到的东西。请您也帮我一下好吗?这实际上有点棘手,这取决于您使用的find版本,而且通常是因为Unix/Linux(mis)处理文件创建时间戳的方式。但我会更新答案,假设你的发现有-newermt。感谢您致电StackOverflow技术支持!;-)@IanMcGowan:我得到了以下错误:find:无效谓词'-newermt',如果您需要,我可以给您使用mtime后获取时间戳的格式。它是:-rw-r--r--1用户手册esmgroup 4 Dec 16 10:42./Dir1/File1_20151215;相关:
    #!/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
    }