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%U
202152
202200
这是唯一两个%
受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