如何查找特定日期范围内丢失的文件?

如何查找特定日期范围内丢失的文件?

我想浏览文件夹中的所有文件并找出特定日期丢失的文件。

文件按小时分区,文件名具有yyyy-mm-dd-hh格式。

所以在2017-07-01和之间2017-07-02将会有 24 个文件2017-07-01-002017-07-01-23

如果我将上述日期作为开始和结束日期,如何找到丢失的每小时文件?

感谢任何输入!

答案1

# presuming that the files are e. g. template-2017-07-01-16:

# To test a given date
for file in template-2017-07-01-{00..23}; do
  if ! [[ -f "$file" ]]; then
    echo "$file is missing"
  fi
done

# To test a given year
year=2017
for month in seq -w 1 12; do
    dim=$( cal $( date -d "$year-$month-01" "+%m %Y" | awk 'NF { days=$NF} END {print days}' )
    for day in $(seq -w 1 $dim); do
        for file in template-${year}-${month}-${day}-{00..23}; do
           if ! [[ -f "$file" ]]; then
             echo "$file is missing"
           fi
        done
    done
done

答案2

在 GNU 系统上:

#! /bin/bash -
ret=0
start=${1?} end=${2?}
t1=$(date -d "$start" +%s) t2=$(date -d "$end" +%s)

for ((t = t1; t < t2; t += 60*60)); do
  printf -v file '%(%F-%H)T' "$t"
  if [ ! -e "$file" ]; then
    printf >&2 '"%s" not found\n' "$file"
    ret=1
  fi
done
exit "$ret"

请注意,在切换到冬令时(在实施夏令时的时区中)的当天,如果切换时的文件丢失,您可能会收到两次错误消息。$TZ如果您希望每天 24 小时(例如,如果创建这些文件的任何内容使用 UTC 时间而不是本地时间),请修复为 UTC0。

答案3

那么像下面这样的命令呢:

 grep -Fvf <(find * -type f \( -name "2017-07-02-00" $(printf " -o -name %s" 2017-07-02-{01..23}) \)) \
           <(printf "%s\n" 2017-07-02-{00..23})
ls
2017-07-02-01  2017-07-02-06  2017-07-02-08  2017-07-02-14  2017-07-02-19
2017-07-02-04  2017-07-02-07  2017-07-02-11  2017-07-02-15  2017-07-02-22

命令运行后的输出:

2017-07-02-00
2017-07-02-02
2017-07-02-03
2017-07-02-05
2017-07-02-09
2017-07-02-10
2017-07-02-12
2017-07-02-13
2017-07-02-16
2017-07-02-17
2017-07-02-18
2017-07-02-20
2017-07-02-21
2017-07-02-23

上面我们生成了 24 个文件的所有可能性,并将printf其传递给find它的-name参数,这printf也对她有帮助,然后使用grep命令我们打印这些文件存在于我们的图案find没有找到他们。

答案4

为什么不使用egrep?然后你可以按照你想要的方式对其进行正则表达式。

 egrep (2017-07-0[1-2]-\d\d$) *file name here*| tail     

正则表达式可能有点不对劲 - 抱歉。

相关内容