ファイル名の文字列タイムスタンプに基づいてファイルをフィルタリングする

ファイル名の文字列タイムスタンプに基づいてファイルをフィルタリングする

ousjgforuigor-TIMESTAMP.txtと同じ名前の数千のファイルを含むフォルダがあります。

タイムスタンプは標準のUnixタイムスタンプ(例:1543932635)です。ファイル名タイムスタンプが>提供されたファイルだけを一覧表示する簡単な方法はありますか?

タイムスタンプの前の文字数は可変ですが、名前は常に-TIMESTAMP.txtで終わります。

これを行うためにbashスクリプトを書くことができますが、これは過度のようです。

ベストアンサー1

使用glob修飾子によるzsh式

t=1543951252 zsh -c 'datefilter() { ts=${REPLY##*-}; ts=${ts%*.txt}; ((ts >= $t)) }; print -l *-<->.txt(+datefilter)'

完全なコマンドは、(最後まで)print -l各パラメータを別々の行に印刷することです。まあ、包括的なコマンドは、zsh環境変数をt指定された値に設定する仮想 bash シェル呼び出しです。ファイル名を印刷するのではなく、配列に挿入、削除、または他の操作を実行できます。

glob修飾子は、*-<->.txt一致できるファイル名を選択します。ファイル名は任意のもの(*)で始まり、ダッシュ(-)、数字の範囲(zshの範囲演算子<->)、最後に.txt;その後、globbingは(+datefilter)その関数の呼び出しであるglob qualifierに送信されます。

このdatefilter関数は(in)に渡されたファイル名を取得し、$REPLYタイムスタンプ値に切り捨てます。タイムスタンプ値がで指定されたタイムスタンプ以上である場合はtrueを返しますt。このテストに成功したファイルはファイル名のままで、残りは削除されます。

globを手動で繰り返すことで、bashで同様の操作を実行できます。

for f in *-*.txt
do 
  ts=${f##*-}
  ts=${ts%.txt}
  [[ ts -ge t ]] && printf '%s\n' "$f"
done

bashワイルドカードは*失われたファイル名を選択できますが、たとえばfoo-bar.txt数字barは必要ありません。それ以外の場合は、次のいくつかの仮定をハードコードする必要があります。

for f in *-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].txt; do # ...

または

for f in *-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*.txt; do # ...

ダッシュとピリオドの間に特定の桁数が表示されるようにします。

おすすめ記事