问题:假设有一个包含 files 的文件夹log1.txt, log2.txt, log3.txt, etc
。我想找到log<N>.txt
不存在的最小整数N。有没有一个简单的命令/方法来实现这一目标?
例子:如果文件夹为空,该命令应返回log1.txt
。如果该文件夹有log1.txt, log2.txt
,该命令应该返回log3.txt
。
答案1
作为bash
脚本:
#!/bin/bash
i=1
while [ -f "log${i}.txt" ]; do
((i++))
done
echo "log${i}.txt"
$i
只要文件存在,while 循环就会递增变量log${i}.txt
。输出echo
不存在的文件名和下一个数字。
答案2
这个可怕的管道将满足您的要求(如果必须的话,将非注释部分连接在一起以创建不可读的一行)。
设置
touch log{1..13}.txt log{15..20}.txt
查找第一个可用的项目放置位置
( find log*.txt | sort -V; echo X ) | # List the files and an extra one at the end
nl | # Add line-numbers
tr -dc '[:digit:][:space:]' | # Strip away non-numeric parts
sed -r '/ ([1-9][0-9]*)\t\1$/d' | # Delete lines with two matching numbers
awk '{print $1; exit}' # Print the the line number of the first remaining match
输出
14
如果您随后填写缺失的槽位
touch log14.txt
输出
21
作为其他读者的旁白,如果您能找到一种改进构造的方法tr | sed | awk
(这通常表明管道编写得不好),我很想看看您的建议。