
ousjgforuigor-TIMESTAMP.txtと同じ名前の数千のファイルを含むフォルダがあります。
タイムスタンプは標準のUnixタイムスタンプ(例:1543932635)です。ファイル名タイムスタンプが>提供されたファイルだけを一覧表示する簡単な方法はありますか?
タイムスタンプの前の文字数は可変ですが、名前は常に-TIMESTAMP.txtで終わります。
これを行うためにbashスクリプトを書くことができますが、これは過度のようです。
答え1
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 # ...
ダッシュとピリオドの間に特定の桁数が表示されるようにします。