我有一个包含数千个文件的文件夹,其名称如 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
,它将每个参数打印在单独的行上。嗯,全面的命令是假定的 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.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 # ...
强制在破折号和句点之间出现一定数量的数字。