![我如何告诉 mkdir 尝试创建 dir1,如果它已经存在,则创建 dir2 等等,直到遇到一个不存在的名称?](https://linux22.com/image/1399787/%E6%88%91%E5%A6%82%E4%BD%95%E5%91%8A%E8%AF%89%20mkdir%20%E5%B0%9D%E8%AF%95%E5%88%9B%E5%BB%BA%20dir1%EF%BC%8C%E5%A6%82%E6%9E%9C%E5%AE%83%E5%B7%B2%E7%BB%8F%E5%AD%98%E5%9C%A8%EF%BC%8C%E5%88%99%E5%88%9B%E5%BB%BA%20dir2%20%E7%AD%89%E7%AD%89%EF%BC%8C%E7%9B%B4%E5%88%B0%E9%81%87%E5%88%B0%E4%B8%80%E4%B8%AA%E4%B8%8D%E5%AD%98%E5%9C%A8%E7%9A%84%E5%90%8D%E7%A7%B0%EF%BC%9F.png)
我想创建一个以数字结尾的目录,例如“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 位数字开始,并且不会超过固定长度。请根据您的要求进行相应调整。