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'

どのシステムでも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%V12月31日と1月1日の間の唯一の変更は、31日が日曜日の場合のみであるため、この方法は年の変更にも正しく機能します。たとえば、2021-12-31金曜日2022-01-01土曜日の両方を提供します。%G%V%Y%U202152202200

これはたった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

関連情報