我如何告诉 mkdir 尝试创建 dir1,如果它已经存在,则创建 dir2 等等,直到遇到一个不存在的名称?

我如何告诉 mkdir 尝试创建 dir1,如果它已经存在,则创建 dir2 等等,直到遇到一个不存在的名称?

我想创建一个以数字结尾的目录,例如“dir1”,如果该目录已经存在,则增加该数字,直到遇到不存在的目录名,我需要在 Linux 命令行中用一行执行此操作,例如:

mkdir --increment dir$

我该如何做呢?

到目前为止我已经得到了这个:

dir=output; n=0; mkdir -p $dir$n; if test -d $dir$n; then n=$((n+1)); echo $dir$n; fi

但它只是回显下一个目录名称,我需要它来递归执行命令。

答案1

这是使用 的一项简单练习while

n=0
同时 !mkdir dir$n
    n=$((n+1))
完毕

但当然,无需多想我们就能意识到,这种简单的机制扩展性不佳。

因此,人们不必重新设计轮子并再次削去所有的角落,而是从模板中创建独特的临时目录,方法略有不同:

名称=$(mktemp -d dirXXXXXXXXXXX)

答案2

如果您只是想逐步创建按正确顺序列出的目录,我可以推荐根据当前日期命名的文件夹吗?

DATE=$(date +%F)
mkdir "dir-$DATE"

它将创建名称类似dir-2014-03-02()的目录YYYY-MM-DD,以便按字母顺序显示。

如果每天创建多个目录,则可以将当前时间添加到文件名中。请参阅man date如何调整 的输出格式date

答案3

首先找到“最大”的目录名,获取其数字并增加其数量:

last_dir=(printf "%s\n" dir* | sort -Vr | head -1)
num=$(last_dir#dir)
mkdir "dir$((num+1))"

答案4

其他答案的附录:如果您需要目录按名称正确排序,您可能还需要用前导零填充新目录编号(NUM)以达到固定长度。

以下内容可以浓缩到一行或嵌入到其他解决方案之一中。

NUM="00"$NUM                  ## Left zero pad with fixed length - 1 zeros 
NUM=${NUM:((${#NUM} - 3)):3}  ## left trim to fixed length (3 in this case)

假设 NUM 至少从 1 位数字开始,并且不会超过固定长度。请根据您的要求进行相应调整。

相关内容