执行命令时文件名递增,中间有暂停

执行命令时文件名递增,中间有暂停

我的文件名中带有数字递增后缀

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 语言环境中使用 GNUsortVersion sort 来执行类似于 zsh 的numericglobsort glob 限定符的操作。

bash也有 ksh 风格$SECONDS,但与 ksh93 或 zsh 不同,它不能是typeset F定位点)

相关内容