使用 ls 命令获取每周的特定文件

使用 ls 命令获取每周的特定文件

ls有人可以帮我使用命令获取每周的文件吗?

ls -t {path} | grep -e "-1700" | head -30 | sort -r

使用这个ls命令,我得到了下面提到的输出

2022.05.30-1700
2022.05.28-1700
2022.05.26-1700
2022.05.25-1700
2022.05.22-1700
2022.05.21-1700
2022.05.18-1700
2022.05.17-1700
2022.05.16-1700
2022.05.15-1700
2022.05.14-1700
2022.05.13-1700
2022.05.12-1700
2022.05.09-1700
2022.05.08-1700
2022.05.02-1700
2022.04.26-1700
2022.04.24-1700
2022.04.23-1700
2022.04.21-1700
2022.04.17-1700
2022.04.16-1700
2022.02.25-1700
2022.02.19-1700
2022.02.12-1700
2022.02.11-1700
2022.01.29-1700
2022.01.23-1700
2022.01.22-1700
2022.01.15-1700

但我们每周只需要一次构建

像这样的例子:

2022.05.21-1700
2022.05.14-1700
2022.05.07-1700
...
...
...

答案1

假设您想选择星期六的内容并且您使用的是 GNU 系统,您可以这样做:

ls {path} |
  tr .- '- ' |
  LC_ALL=C date -uf - '+%A %Y.%m.%d-%H%M' |
  grep -Po '^Saturday \K.*-1700'

使用zsh(以及在任何系统上),您可以使用 glob 限定符函数执行相同的操作:

zmodload zsh/datetime
On{Mon,Tue,Wed,Thu,Fru,Sat,Sun} () {
  local t
  TZ=UTC0 strftime -rs t %Y.%m.%d-%H%M $REPLY:t &&
    TZ=UTC0 LC_ALL=C strftime -s t %a $t &&
    [[ $0 = On$t ]]
}

进而:

print -rC1 -- <1900-2100>.<1-12>.<1-31>-1700(N+OnSat)

对于周六的人来说。

在你的样本上,他们给出了:

2022.01.15-1700
2022.01.22-1700
2022.01.29-1700
2022.02.12-1700
2022.02.19-1700
2022.04.16-1700
2022.04.23-1700
2022.05.14-1700
2022.05.21-1700
2022.05.28-1700

您会注意到存在一些间隙,因为每个星期六都没有一个文件。

要每周获取一次(每周最晚一次)(每周从周日到周六),您可以执行以下操作:

ls -r {path} |
  tr .- '- ' |
  date -uf - '+%Y%U %Y.%m.%d-%H%M' |
  uniq -w6 |
  cut -d' ' -f2

您的样本给出了:

2022.05.30-1700
2022.05.28-1700
2022.05.21-1700
2022.05.14-1700
2022.05.02-1700
2022.04.26-1700
2022.04.23-1700
2022.04.16-1700
2022.02.25-1700
2022.02.19-1700
2022.02.12-1700
2022.01.29-1700
2022.01.22-1700
2022.01.15-1700

(并非全部都在星期六)。

对于从周一到周日的周,替换%Y%U%G%V(ISO 周年份和数字)。该方法也可以在年份变化的情况下正确工作,因为如果 31 日是星期日,则在 12 月 31 日和 1 月1之间唯一发生变化%G,同时给出星期五 2021-12-31 和星期六 2022-01-以01为例。%V%Y%U202152202200

这是唯一两个%date.为了几周从不同的日子开始我们需要采取不同的方法。

例如,我们可以将相应日期的纪元时间解释为 UTC,除以一周中的秒数,适当偏移所需的一周第一天,这也可以避免一年中第一天出现问题。

例如,对于从星期日开始的几周:

ls -r {path} |
  tr .- '- ' |
  date -uf - '+%s %Y.%m.%d-%H%M' |
  awk '{week = int(($1 / 86400 - 3)/ 7)}
       week != last {print $2}
       {last = week}'

替换- 3- 4从星期一开始的几周,或- 2从星期六开始的几周。

或者与zsh

zmodload zsh/datetime
typeset -A latest=()
for f (<1900-2100>.<1-12>.<1-31>-1700(N))
  TZ=UTC0 strftime -rs t %Y.%m.%d-%H%M $f &&
  latest[$(( (t / 86400 - 3) / 7 ))]=$f
print -roC1 -- $latest

相关内容