当前位置: 首页>>技术教程>>正文


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

, , , ,

问题描述

如果我想创建多个目录(在同一级别上),然后为它提供一个逗号分隔的目录名列表(或者那个效果)?

最佳解决方法

简短的回答

mkdir采用多个参数,只需运行即可

mkdir dir_1 dir_2

次佳解决方法

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

让人们思考它的一些例子:

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. 相同但每个目录将保持sax1到sax50的50倍(-p将创建父目录,如果它们不存在。

  3. 从a12345到z12345的26个目录

  4. 逗号分隔列表制作目录1,2和3。

  5. test01test10的10个目录。

  6. 与4相同,但当前日期为目录,1,2,3在其中。

  7. 与4相同,但当前用户为目录,1,2,3在其中。

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

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

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

第三种解决方法

它非常简单,让您想要创建一个目录结构,例如:

Websites/
  static/
      cs
      js
  templates/
      html

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

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

小心不要输入任何空格

第四种方法

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

mkdir `cat list`

您现在应该拥有列表中指定的所有目录。

第五种方法

像这样的东西? (感谢muru为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
$ 

第六种方法

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

Shell + 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,并运行括号括起来的命令[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

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

蟒蛇

Pythonic做同样的方法,就是读取每一行,摆脱尾随的\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)

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1070.html,未经允许,请勿转载。