C'è un modo per creare più directory contemporaneamente con mkdir?

86

Se volessi creare più directory (sullo stesso livello) e poi darle un elenco separato da virgole di nomi di directory (o qualcosa del genere)?

    
posta BGroat 09.02.2016 - 19:30

7 risposte

136

Risposta breve

mkdir richiede più argomenti, è sufficiente eseguire

mkdir dir_1 dir_2
    
risposta data Jacob Vlijm 09.02.2016 - 19:32
132

Puoi usare gli elenchi per creare directory e può diventare piuttosto selvaggio.

Alcuni esempi per convincere la gente a pensarci:

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 directory da sa1 a sa50
  2. stesso ma ognuna delle directory contiene 50 volte sax1 attraverso sax50 (-p creerà le directory madri se non esistono.
  3. 26 directory da a12345 a z12345
  4. elenco separato da virgola rende dirs 1, 2 e 3.
  5. 10 directory da test01 a test10 .
  6. uguale a 4 ma con la data corrente come directory e 1,2,3 in esso.
  7. uguale a 4 ma con l'utente corrente come directory e 1,2,3 in esso.

Quindi, se ho capito bene e vuoi creare alcune directory e all'interno di esse nuove directory, puoi fare questo:

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

e ottieni sa1, sa2, ..., sa10 e all'interno di ogni directory 1, 2 e 3.

    
risposta data Rinzwind 09.02.2016 - 19:49
19

È molto semplice, ti permette di creare una struttura di directory come:

Websites/
  static/
      cs
      js
  templates/
      html

Puoi farlo in un singolo comando come questo:

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

Fai attenzione a non inserire spazi

    
risposta data anas munir 23.09.2016 - 22:28
14

Crea un elenco dei nomi delle directory desiderate utilizzando le interruzioni di riga anziché le virgole come separatore. Salva questa lista.

mkdir 'cat list'

Ora dovresti avere tutte le directory nominate nel tuo elenco.

    
risposta data SpaceCadet 09.02.2016 - 23:53
8

Qualcosa di simile? (grazie a muru per il suggerimento printf )

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

Puoi racchiuderlo in una funzione per facilità d'uso:

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

Quindi vuoi un elenco separato da virgole di nomi di directory? Questo può essere fatto.

Shell + coreutils

Dato che tutti stanno postando oneliner, anche il mio (mkdir + sostituzione dei parametri + reindirizzamento della 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

AWK è un linguaggio di elaborazione del testo, ma ha una funzione system() molto carina che chiamerà la shell di default ed eseguirà il comando [s] racchiuso tra parentesi (che deve essere una stringa).

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

Oppure puoi rimuovere , con la funzione gsub() e chiamare system("mkdir "$0) ma questo potrebbe essere un problema se vuoi creare directory con spazi nel loro nome

Python

Il modo Python di fare lo stesso, sarebbe quello di leggere ogni riga, eliminare il finale \n , inserire tutto in un elenco, scorrere le voci dell'elenco e creare le directory per elemento dell'elenco. Si noti che nell'esempio seguente, /home/xieerqi/dirList.txt è il percorso completo assegnato al mio file e creiamo il percorso completo di ogni nuova directory unendo la stringa /home/username/ e il nome della directory read dall'elenco. Sostituisci i tuoi valori come necessario

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)
    
risposta data Sergiy Kolodyazhnyy 09.02.2016 - 19:44
0

Il comando mkdir accetta più argomenti, semplicemente esegui come sotto

mkdir dir1 dir2 dir3 ... dirN

Se desideri creare più sottodirectory, puoi passare tali argomenti in {} come mostrato di seguito

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

Leggi altre domande sui tag