生成模式的下一个可用文件名(02-output.log 等)

生成模式的下一个可用文件名(02-output.log 等)

我可以mktemp(1)在 shell 脚本中使用,在具有合适后缀和前缀的目录中创建临时文件。

是否有一个命令,给定一个模式(例如NN-output.log)将寻找01-output.log,如果存在则返回02-output.log(或下一个可用数字)?我想要一个命令“获取下一个连续可用的文件名”,而不必自己在脚本中编写该命令。

我知道我可以使用date -Iseconds或类似的方法来获取唯一的、递增的文件名,但是有什么可以产生更简单的递增文件名吗?

我知道编写这样的程序可能很容易,但在我自己编写之前,我想看看是否有人已经完成了。

更新有人问“脚本如何知道模式?”我建议就像 mktemp 一样,将模式提供给程序。例如“给我下一个名为output-XX.log的文件”,程序将查看X并填写01,查找该文件等。

答案1

下面是至少可与 ksh 和 bash 一起使用的 shell 函数。正如评论所说,从这个特定问题中期望输入模式是硬编码的;也就是说,格式为“XX”(恰好是两个 X),后跟一些东西——而不是问题所暗示的(某物)-XX。

该脚本使用参数扩展来去掉前导 XX,以保存以便以后与增加的n索引进行重组。然后它从 1 循环到 99,如果需要的话用零填充数字,然后查找[ ! -f ... ]此类文件是否不存在。如果不存在,则打印该文件名并成功返回 ( return 0)。如果它退出循环而没有找到可用文件,它会向 stderr ( >&2) 打印一条消息,打印没有什么到 stdout,并返回失败的返回代码 ( return 1)。

# hard-coded to expect an input pattern of XX(something)
function rmktemp {
  pattern=$1
  suffix=${pattern#XX}
  n=1
  while [ $n -lt 100 ]
  do
    if [ $n -lt 10 ]
    then
      n="0${n}"
    fi
    tfile="${n}${suffix}"
    if [ ! -f "$tfile" ]
    then
      printf "%s\n" "$tfile"
      return 0
    fi
    n=$((n+1))
  done
  if [ $n -eq 100 ]
  then
    echo Could not find an unused file >&2
    return 1
  fi
}

像这样使用它:

LOG=$(rmktemp XX-output.log)
[ $? -eq 0 ] && echo stuff > "$LOG"

相关内容