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

Yu *_* Ni 6 find files

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

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

所以之间的2017-07-012017-07-02将有来自24个文件2017-07-01-00通过2017-07-01-23

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

感谢任何输入!

Dop*_*oti 9

# 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
Run Code Online (Sandbox Code Playgroud)

  • 要么会起作用;这是一个问题,你的想法是否更符合“if (not foo)”或“if not (foo)”;在这种情况下,它们在逻辑上是不可区分的。它们是“如果不(文件存在)”和“如果(文件不存在)”。 (3认同)

Sté*_*las 6

在 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"
Run Code Online (Sandbox Code Playgroud)

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