Files
按文件名中的字元串時間戳過濾文件
我有一個包含數千個文件的文件夾,其名稱類似於 ousjgforuigor-TIMESTAMP.txt
時間戳是標準的 Unix 時間戳(例如 1543932635)。有沒有一種簡單的方法可以只列出文件名時間戳>提供的文件?
時間戳前的字元數是可變的,但名稱總是以 -TIMESTAMP.txt 結尾
我可以編寫一個 bash 腳本來執行此操作,但這似乎有點矯枉過正。
使用zsh 的 expression-as-a-glob-qualifier,
t=1543951252 zsh -c 'datefilter() { ts=${REPLY##*-}; ts=${ts%*.txt}; ((ts >= $t)) }; print -l *-<->.txt(+datefilter)'
整個命令(接近結尾)是
print -l
,它將每個參數列印在單獨的行上。好吧,整個命令是一個假定的 bash shell 呼叫,zsh
它將環境變數設置t
為某個給定值。您可以將它們放在一個數組中或刪除它們或對它們做任何您想做的事情,而不是列印文件名。glob 限定符
*-<->.txt
選擇可能匹配的文件名 - 以任何 (*
) 開頭的文件名,後跟破折號 (-
),後跟任何數字範圍(zsh 的範圍運算符<->
),然後是.txt
; 然後將該 glob 發送到 glob qualifier(+datefilter)
,這是對相應函式的呼叫。該
datefilter
函式採用傳入的文件名 (in$REPLY
) 並將其修剪為時間戳值。如果該時間戳值大於或等於 中的給定時間戳,則返回 truet
。在該測試中成功的文件被保存為文件名;其餘的被丟棄。您可以通過手動循環 glob 在 bash 中執行類似的操作:
for f in *-*.txt do ts=${f##*-} ts=${ts%.txt} [[ ts -ge t ]] && printf '%s\n' "$f" done
儘管 bash 萬用字元
*
可以拾取雜散文件名,例如foo-bar.txt
wherebar
不需要是數字。否則,您必須對某些假設進行硬編碼,例如: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 # ...
強制在破折號和句點之間出現一些數字。