我如何告诉mkdir尝试创建dir1,如果它已经存在,则创建dir2,以此类推,直到找到不存在的名称为止?


13

我想创建一个末尾带有数字的目录,例如“ 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

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

Answers:


26

这是使用以下琐碎的练习while

n = 0
一会儿!mkdir目录$ n
做
    n = $((n + 1))
做完了

但是,当然不需要太多的思考就可以意识到这种琐碎的机制无法很好地扩展。

因此,与其重新发明轮子并不必再次剃光所有角落,不如从模板中创建一个唯一的临时目录,方法有所不同:

名称= $(mktemp -d dirXXXXXXXXXXX)


对该数字进行二进制搜索可能就足够了。
托尔比约恩Ravn的安德森

在重新设计轮子的过程中,有很多地方需要剃光,其中最重要的是记住文件系统,考虑安全性和并行化。
JdeBP 2014年

6

如果您只想增量创建以正确顺序列出的目录,我是否可以建议根据当前日期命名的文件夹?

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

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

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


5

首先找到“最大”目录名,获取数字并递增:

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

这是一个好主意,但并不容易实现。
托尔比约恩Ravn的安德森

除非有数百万个目录,否则并行化肯定是过早的优化。
格伦·杰克曼(Glenn jackman)2014年

你为什么需要printf在这里?不会简单的echo工作吗?
Ruslan 2014年

另外,我会用dir[0-9]*代替dir*
Ruslan 2014年

1
你误会了。我谈论脚本是否明智地一次运行多次(多个线程,多个用户等)。
托尔比约恩Ravn的安德森

2

假设您的目录始终从“ dir1”开始,并且没有名为$ dir *的文件(即它们都是按顺序编号的目录),那么您可以避免使用此衬板-

mkdir ${dir}$(( `ls ${dir}* | wc -w` + 1 ))

这将计算以$ dir开头的文件数,然后将一个数字添加到该目录中并创建一个新文件。


0

其他答案的附录:如果您需要按名称正确排序目录,则可能还需要将新目录号(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位,并且不会超过固定长度。根据您的要求进行相应调整。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.