有没有一种方法可以使用mkdir一次创建多个目录?


111

如果我想创建多个目录(在同一级别上),然后以逗号分隔的目录名称列表(或类似的名称)提供给它?


38
man mkdir....
Sparhawk

5
每当您想知道某个命令是否可以完成您想做的事情时,请键入man该命令的名称。
David Richerby '16

@DavidRicherby尽管man mkdir“种类”建议可以一次创建多个目录,但并未具体提及,也没有提及如何实现。
雅各布·弗利姆

2
@JacobVlijm用于mkdir的GNU coreutils 8.21手册说:“ NAME mkdir- 创建目录// 概要 mkdir [选项] ... [目录] ... // 描述如果目录不存在,则创建目录。” 显然可以建立多个目录。
David Richerby '16

9
@JacobVlijm没有指导的情况下,手册页的行话不是很明显,但是在手册页的技术语言中,即使在给定的引用中,信息也是完全清楚的。注意...after [DIRECTORY],这意味着可以重复该参数。因此DIRECTORY(ies)是指所有传递的DIRECTORY参数。但是,“ RTFM”注释有时会忘记要学习的符号。
Blaisorblade '02

Answers:



152

您可以使用列表来创建目录,并且目录会变得很疯狂。

一些使人们思考的示例:

mkdir sa{1..50}
mkdir -p sa{1..50}/sax{1..50}
mkdir {a-z}12345 
mkdir {1,2,3}
mkdir test{01..10}
mkdir -p `date '+%y%m%d'`/{1,2,3} 
mkdir -p $USER/{1,2,3} 
  1. 从sa1到sa50的50个目录
  2. 相同,但是每个目录将保存50次sax1到sax50(-p将创建父目录(如果不存在)。
  3. 从a12345到z12345的26个目录
  4. 逗号分隔的列表使目录1、2和3。
  5. test01到10个目录test10
  6. 与4相同,但以当前日期为目录,并在其中包含1,2,3。
  7. 与4相同,但当前用户为目录,其中包含1,2,3。

因此,如果我正确理解它,并且想要创建一些目录,并在其中创建新目录,则可以执行以下操作:

mkdir -p sa{1..10}/{1,2,3}

并在每个目录1、2和3中获取sa1,sa2,...,sa10。


我同意@gniourf_gniourf ...您的答案中没有使用正则表达式。您是要说其他话还是提供其他示例?
斯利普·汤普森

1
@gniourf_gniourf完成了:)
Rinzwind '16

3
值得一提的是,在POSIX shell中未定义括号扩展:pubs.opengroup.org/onlinepubs/9699919799/utilities/…例如,在Ubuntu dash的默认设置中,它将不起作用/bin/sh
pabouk '16

7
这个答案取决于shell在将输入作为mkdir的参数提供输入之前对其进行扩展。仅仅说mkdir可以创建带有多个参数的多个dis,然后再讨论给定的shell如何使之更简单,就更准确了。
deed02392 '02

如果我尝试做类似的事情mkdir sa$(seq 0.1 0.1 1),它所做的就是创建一个名为sa0.1的目录,其余目录创建0.2、0.3,...,1。如何在不编写整个列表的情况下扩展小数括号?
Plinth'1

26

这非常简单,可以让您创建目录结构,例如:

Websites/
  static/
      cs
      js
  templates/
      html

您可以在单个命令中执行以下操作:

mkdir -p Website/{static/{cs,js},templates/html}

注意不要进入任何空格


您也可以在运行命令之前按此处的tab展开它们。
艾萨克·格雷格森

14

使用换行符而不是逗号作为分隔符,列出所需目录的名称。保存该列表。

mkdir `cat list`

现在,您应该在列表中命名了所有目录。


1
是的,但是需要注意的是-目录名必须是一个完整的字符串。如果一行是spaced dir,则它将创建两个dirs spaced和`dir。
Sergiy Kolodyazhnyy

是的-您甚至无法成功对空格进行任何形式的转义- junk\ dirlist文件中提供了两个目录,junk\ dir。当我\ 在目录名称中看到时,让我感到恐慌。
Jon V

可以将其与-p其他答案中提到的标志结合使用。如果是这样,则list文件不必包含父目录作为它们自己的行,它们将被检测并自动创建。
mcw0933

8

像这样吗 (感谢printf小贴士)

printf '%s' 'foo,bar,baz' | xargs -d, mkdir
$ ls
$ printf '%s' 'foo,bar,baz' | xargs -d, mkdir
$ ls
bar  baz  foo
$ 

您可以将其包装为一个易于使用的函数:

function mkdir_cs {
    printf '%s' "$1" | xargs -d, mkdir
}
$ ls
$ mkdir_cs 'foo,bar,baz'
$ ls
bar  baz  foo
$ 

1
只要一个printf "%s" "$1" | xargs -d, mkdir就足够了。
muru

7

因此,您是否希望用逗号分隔目录名称列表?可以做到的。

壳牌+ coreutils

由于每个人都在发布oneliners,所以这里也是我的(mkdir +参数替换加+ shell重定向)。

DIR:/testdir
skolodya@ubuntu:$ ls

DIR:/testdir
skolodya@ubuntu:$ mkdir $( tr '[,\n]' ' '   < /home/xieerqi/dirList.txt   )                                           

DIR:/testdir
skolodya@ubuntu:$ ls
dirFive/  dirfour/  dirone/  dirthree/  dirtwo/

AWK

AWK是一种文本处理语言,但是它具有非常好的system()功能,它将调用默认的shell,并运行括号内的命令(必须为字符串)。

DIR:/xieerqi
skolodya@ubuntu:$ awk -F ',' '{for(i=1;i<=NF;i++) system("mkdir "$i)}' dirList.txt                                    

DIR:/xieerqi
skolodya@ubuntu:$ ls -ld dir*                                                                                         
-rw-rw-r-- 1 xieerqi xieerqi   23 Feb  9 11:41 dirList.txt
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirone/
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirthree/
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirtwo/

DIR:/xieerqi
skolodya@ubuntu:$ cat dirList.txt                                                                                     
dirone,dirtwo,dirthree

或者您可以,使用gsub()函数删除并调用,system("mkdir "$0)但是如果要创建名称中带有空格的目录,则可能会出现问题

蟒蛇

用Python的方式做同样的事情,将是读取每一行,摆脱尾随\n,将所有内容推入一个列表,然后遍历列表项并为每个列表项创建dirs。请注意,在下面的示例中,/home/xieerqi/dirList.txt是给我文件的完整路径,我们通过连接字符串/home/username/和从列表中读取的目录名称来组成每个新目录的完整路径。根据需要替换您自己的值

DIR:/testdir
skolodya@ubuntu:$ ls                                                                                                  

DIR:/testdir
skolodya@ubuntu:$ /home/xieerqi/makeDirs.py                                                                           

DIR:/testdir
skolodya@ubuntu:$ ls
dirFive/  dirfour/  dirone/  dirthree/  dirtwo/

DIR:/testdir
skolodya@ubuntu:$ cat /home/xieerqi/makeDirs.py
#!/usr/bin/env python
import os
with open("/home/xieerqi/dirList.txt") as file:
   for line in file:
         for directory in line.strip().rsplit(','):
             path = '/home/xieerqi/testdir/' +  directory
             os.makedirs(path)

3
我认为提问者实际上不希望列表用逗号分隔;我很确定那只是他们对语法可能的猜测。
David Richerby '16

好吧,OP可能并没有完全用逗号分隔的列表,但是可以肯定的是,它可以用作一种方法,要点是“列表可以使用,您也不必单独键入每个目录的名称”。尤其是当无法使用范围生成大列表时,这将很有用dir{1..1000}。假设您
要按

1

mkdir命令采用多个参数,如下所示运行

mkdir dir1 dir2 dir3 ... dirN

如果您要创建多个子目录,则可以在{}中传递这些参数,如下所示(仅使用逗号分隔参数,不能使用空格)。

mkdir dir1 dir2/{subdir1,subdir2,subdir3,subdirN} dir3 dirN
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.