按文件名中的字符串时间戳过滤文件

按文件名中的字符串时间戳过滤文件

我有一个包含数千个文件的文件夹,其名称如 ousjgforuigor-TIMESTAMP.txt

时间戳是标准的 Unix 时间戳(例如 1543932635)。有没有一种简单的方法来仅列出文件名时间戳>提供的文件?

时间戳之前的字符数是可变的,但名称始终以 -TIMESTAMP.txt 结尾

我可以编写一个 bash 脚本来执行此操作,但这似乎有点矫枉过正。

答案1

使用zsh 的表达式作为 glob 限定符,

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; 的文件名。然后该 globbing 被发送到 glob 限定符(+datefilter),这是对相应函数的调用。

datefilter函数获取传入的文件名(在 中$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.txtwherebar不需要是数字。否则,您必须对某些假设进行硬编码,例如:

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 # ...

强制在破折号和句点之间出现一定数量的数字。

相关内容