Existe uma maneira de criar vários diretórios de uma só vez com o mkdir?

80

Se eu quisesse criar vários diretórios (no mesmo nível) e, em seguida, fornecer uma lista separada por vírgulas de nomes de diretórios (ou algo assim)

    
por BGroat 09.02.2016 / 19:30

7 respostas

131

Resposta curta

mkdir recebe vários argumentos, basta executar

mkdir dir_1 dir_2
    
por Jacob Vlijm 09.02.2016 / 19:32
127

Você pode usar listas para criar diretórios e pode ficar bem louco.

Alguns exemplos para fazer as pessoas pensarem sobre isso:

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. 50 diretórios de sa1 a sa50
  2. mesmo, mas cada um dos diretórios conterá 50 vezes o sax1 até o sax50 (-p criará diretórios-pais, se eles não existirem.
  3. 26 diretórios de a12345 a z12345
  4. A lista separada por vírgulas
  5. faz as dirs 1, 2 e 3.
  6. 10 diretórios de test01 a test10 .
  7. igual a 4 mas com a data atual como um diretório e 1,2,3 nele.
  8. igual a 4, mas com o usuário atual como um diretório e 1,2,3 nele.

Então, se eu entendi corretamente e você quer criar alguns diretórios, e dentro deles novos diretórios, então você poderia fazer isso:

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

e obtenha sa1, sa2, ..., sa10 e dentro de cada dirs 1, 2 e 3.

    
por Rinzwind 09.02.2016 / 19:49
17

É muito simples, permite criar uma estrutura de diretórios como:

Websites/
  static/
      cs
      js
  templates/
      html

Você pode fazer isso em um único comando assim:

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

Cuidado para não inserir espaços

    
por anas munir 23.09.2016 / 22:28
12

Faça uma lista dos nomes dos seus diretórios desejados usando quebras de linha em vez de vírgulas como separador. Salve essa lista.

mkdir 'cat list'

Agora você deve ter todos os diretórios nomeados em sua lista.

    
por SpaceCadet 09.02.2016 / 23:53
8

Algo como isso? (graças ao muru pela printf tip)

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

Você pode envolvê-lo em uma função para facilitar o uso:

function mkdir_cs {
    printf '%s' "$1" | xargs -d, mkdir
}
$ ls
$ mkdir_cs 'foo,bar,baz'
$ ls
bar  baz  foo
$ 
    
por kos 09.02.2016 / 19:49
7

Então você quer uma lista separada por vírgulas de nomes de diretórios? Isso pode ser feito.

Shell + coreutils

Já que todo mundo está postando oneliners, aqui está o meu também (mkdir + substituição de parâmetro mais + redirecionamento de shell).

DIR:/testdir
[email protected]:$ ls

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

DIR:/testdir
[email protected]:$ ls
dirFive/  dirfour/  dirone/  dirthree/  dirtwo/

AWK

O AWK é uma linguagem de processamento de texto, mas tem uma função system() muito boa que chama o shell padrão e executa o comando [s] entre parênteses (que deve ser uma string).

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

DIR:/xieerqi
[email protected]:$ 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
[email protected]:$ cat dirList.txt                                                                                     
dirone,dirtwo,dirthree

Ou você pode remover a função , with gsub() e chamar system("mkdir "$0) , mas isso pode ser um problema se você quiser criar diretórios com espaços em seus nomes

Python

A maneira Pythonic de fazer o mesmo, seria ler cada linha, livrar-se de \n , colocar tudo em uma lista e iterar sobre os itens da lista e criar diretórios por item da lista. Note que no exemplo abaixo, /home/xieerqi/dirList.txt é o caminho completo dado ao meu arquivo, e nós criamos o caminho completo de cada novo diretório unindo a string /home/username/ e o nome do diretório lido da lista. Substitua seus próprios valores conforme necessário

DIR:/testdir
[email protected]:$ ls                                                                                                  

DIR:/testdir
[email protected]:$ /home/xieerqi/makeDirs.py                                                                           

DIR:/testdir
[email protected]:$ ls
dirFive/  dirfour/  dirone/  dirthree/  dirtwo/

DIR:/testdir
[email protected]:$ 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)
    
por Sergiy Kolodyazhnyy 09.02.2016 / 19:44
0

O comando mkdir leva vários argumentos, simplesmente execute como abaixo

mkdir dir1 dir2 dir3 ... dirN

Se você quiser criar vários subdiretórios, poderá transmitir esses argumentos em {}, conforme mostrado abaixo

mkdir dir1 dir2/{subdir1, subdir2, subdir3, subdirN} dir3 dirN
    
por Vijay Sasvadiya 20.07.2018 / 08:38