有没有办法用 mkdir 一次创建多个目录?

BGr*_*oat 150 command-line directory coreutils mkdir

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

Rin*_*ind 187

您可以使用列表来创建目录,它会变得非常疯狂。

一些让人们思考的例子:

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} 
Run Code Online (Sandbox Code Playgroud)
  1. 从 sa1 到 sa50 的 50 个目录
  2. 相同,但每个目录将包含 sax1 到 sax50 的 50 倍(如果父目录不存在,-p 将创建它们。
  3. 从 a12345 到 z12345 的 26 个目录
  4. 逗号分隔列表使目录为 1、2 和 3。
  5. 从10个目录test01通过test10
  6. 与 4 相同,但以当前日期作为目录,其中包含 1,2,3。
  7. 与 4 相同,但将当前用户作为目录,其中包含 1,2,3。

因此,如果我理解正确并且您想创建一些目录,并在其中创建新目录,那么您可以这样做:

mkdir -p sa{1..10}/{1,2,3}
Run Code Online (Sandbox Code Playgroud)

并获得 sa1、sa2、...、sa10 以及每个目录 1、2 和 3。

  • 这个答案取决于 shell 在将输入作为 * 参数提供给 mkdir* 之前对输入进行扩展。更准确的说法是 mkdir 可以使用多个参数创建多个目录,然后*然后*谈论给定的 shell 如何使这更容易。 (8认同)
  • 值得一提的是,在 POSIX shell 中没有定义大括号扩展:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06 例如它不会在默认的 `dash` 中工作`/bin/sh` 在 Ubuntu 上。 (3认同)

Jac*_*ijm 183

简答

mkdir 接受多个参数,只需运行

mkdir dir_1 dir_2
Run Code Online (Sandbox Code Playgroud)


小智 46

很简单,让你想创建一个目录结构,例如:

Websites/
  static/
      cs
      js
  templates/
      html
Run Code Online (Sandbox Code Playgroud)

您可以在这样的单个命令中执行此操作:

mkdir -p Website/{static/{cs,js},templates/html}
Run Code Online (Sandbox Code Playgroud)

注意不要输入任何空格


小智 16

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

mkdir `cat list`
Run Code Online (Sandbox Code Playgroud)

您现在应该拥有列表中命名的所有目录。

  • 是的,这可以工作,但是,有一个警告 - 目录名称必须是一个完整的字符串。如果一行是“spaced dir”,那么它将创建两个目录,“spaced”和“dir”。 (2认同)

kos*_*kos 8

像这样的东西?(感谢穆鲁的printf小费)

printf '%s' 'foo,bar,baz' | xargs -d, mkdir
Run Code Online (Sandbox Code Playgroud)
$ ls
$ printf '%s' 'foo,bar,baz' | xargs -d, mkdir
$ ls
bar  baz  foo
$ 
Run Code Online (Sandbox Code Playgroud)

您可以将其包装成一个函数以方便使用:

function mkdir_cs {
    printf '%s' "$1" | xargs -d, mkdir
}
Run Code Online (Sandbox Code Playgroud)
$ ls
$ mkdir_cs 'foo,bar,baz'
$ ls
bar  baz  foo
$ 
Run Code Online (Sandbox Code Playgroud)


Ser*_*nyy 7

所以你想要逗号分隔的目录名称列表?那可以做到。

外壳 + 核心工具

由于每个人都在发布 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/
Run Code Online (Sandbox Code Playgroud)

AWK

AWK 是一种文本处理语言,但它具有非常好的system()功能,可以调用默认的 shell ,并运行括在括号中的 command[s](必须是字符串)。

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
Run Code Online (Sandbox Code Playgroud)

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

Python

Pythonic 的做法是读取每一行,去掉尾随\n,将所有内容都推入一个列表,然后遍历列表项并为每个列表项创建目录。请注意,在下面的示例中,/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)
Run Code Online (Sandbox Code Playgroud)

  • 我不认为提问者实际上_希望_列表以逗号分隔;我很确定这只是他们对语法的猜测。 (3认同)

小智 6

mkdir 命令需要多个参数,只需按如下方式运行

mkdir dir1 dir2 dir3 ... dirN
Run Code Online (Sandbox Code Playgroud)

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

mkdir -p dir1 dir2/{subdir1,subdir2,subdir3,subdirN} dir3 dirN
Run Code Online (Sandbox Code Playgroud)

使用选项“-p”根据需要创建父目录。