我的基本目录有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日,那么此文件也应该在搜索中计算?
答案 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
对于额外的功劳,您可以想象将其转换为输入
的功能看起来像是:
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 \)
这看起来有点混乱,但将其分解为小步骤,这是有道理的:
#!/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”的正确格式。