我可以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"