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'
どのシステムでもglob修飾子関数を使用してzsh
同じことを実行できます。
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
毎週土曜日のファイルがないので、いくつかの空白があることがわかります。
週に1回(遅くとも毎週)(日曜日から土曜日まで毎週)を受け取るには、次の手順を実行します。
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
(土曜日にすべてではありません)。
月曜日から日曜日までの週は(ISO年と数字)%Y%U
に置き換えられます。%G%V
12月31日と1月1日の間の唯一の変更は、31日が日曜日の場合のみであるため、この方法は年の変更にも正しく機能します。たとえば、2021-12-31金曜日と2022-01-01土曜日の両方を提供します。%G
%V
%Y%U
202152
202200
これはたった2つの%
科目です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