我的文件名中带有数字递增后缀
filename01
filename02
.
.
.
filename250
我希望能够执行在执行下一个 cat 命令之前可以暂停的命令
cat filename01
wait (1sec)
cat filename02
wait (1sec)
.
.
.
.
cat filename250
请帮忙。我的最后一个文件名 (filename250) 可以有更高的后缀。不确定我是否可以使用变量设置进行 for 循环,或者如果您分享,请提供更好的建议。谢谢你!
答案1
为了能够对这些文件进行数字排序,最好是使用zsh
而不是bash
因为它有一个n
数字全局排序 全局限定符为了那个原因。如果没有它,filename250
例如在filename*
glob 扩展中,您将在filename25
和 之间进行排序,filename26
因为默认的 glob 排序顺序是词法的。
for file in filename<1-250>(Nn); do
cat < $file
sleep 1
done
(N
如果没有匹配的文件,也可以使用 ulllglob 限定符来避免错误)。
替换<1-250>
为<->
可匹配任何数字(1 个或多个 ASCII 十进制数字的序列),或*
匹配任何内容。
每秒捕获一个文件,而不是在每个文件之间等待一秒cat
(并考虑到cat
文件所需的时间):
typeset -F SECONDS=0
n=0
for file in filename<1-250>(Nn); do
cat < $file
(( SECONDS >= ++n )) || sleep $(( n - SECONDS ))
done
(这里假设 asleep
可以采用浮点数)。
在bash
和最近的 GNU 系统上,您可以执行类似的操作:
shopt -s nullglob extglob
print0() { [ "$#" -eq 0 ] || printf '%s\0' "$@"; }
readarray -td '' files <(
print0 filename+([0123456789]) |
LC_ALL=C sort -zV
)
for file in "${files[@]}"; do
cat < "$file"
sleep 1
done
我们在 C 语言环境中使用 GNUsort
的V
ersion sort 来执行类似于 zsh 的n
umericglobsort glob 限定符的操作。
(bash
也有 ksh 风格$SECONDS
,但与 ksh93 或 zsh 不同,它不能是typeset
F
定位点)