Shell 如何编写UNIX脚本来检查目录是否包含指定数量的文件
我有一个基本目录,它有4个目录:Dir1 Dir2 Dir3 Dir4。每个目录都有以下格式的文件: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
“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
}