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


112

Se volessi creare più directory (sullo stesso livello) e poi inserirle in un elenco separato da virgole di nomi di directory (o qualcosa in tal senso)?


38
man mkdir....
Sparhawk,

5
Ogni volta che vuoi sapere se un comando può fare qualcosa che vuoi fare, digita manseguito dal nome del comando.
David Richerby,

@DavidRicherby anche se man mkdir"kind of" suggerisce la possibilità di creare più directory contemporaneamente, non è menzionato in modo specifico, né come farlo.
Jacob Vlijm,

2
@JacobVlijm La manpage GNU coreutils 8.21 per mkdir dice " NOME mkdir - crea directory // SINOSSI mkdir [OPZIONE] ... [DIRECTORY] ... // DESCRIPTION Crea la DIRECTORY (e) se non esiste già." Sembra abbastanza chiaro che puoi creare più di una directory.
David Richerby,

9
@JacobVlijm Il gergo delle pagine man non è ovvio senza istruzioni, ma nel linguaggio tecnico delle pagine man, le informazioni sono totalmente chiare, anche nella citazione fornita. Nota il ...dopo [DIRECTORY], nel senso che l'argomento può essere ripetuto. Quindi si DIRECTORY(ies)riferisce a tutti gli DIRECTORYargomenti passati . Tuttavia, i commenti "RTFM" a volte dimenticano che c'è una notazione da imparare.
Blaisorblade,

Risposte:


147

Risposta breve

mkdir accetta più argomenti, semplicemente esegui

mkdir dir_1 dir_2

152

È possibile utilizzare gli elenchi per creare directory e può diventare piuttosto selvaggio.

Alcuni esempi per indurre le persone 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. lo stesso ma ognuna delle directory conterrà 50 volte da sax1 a sax50 (-p creerà le directory principali se non esistono.
  3. 26 directory dalla a12345 alla z12345
  4. elenco separato da virgole rende le directory 1, 2 e 3.
  5. 10 directory da test01attraverso test10.
  6. uguale a 4 ma con la data corrente come directory e 1,2,3 in essa.
  7. uguale a 4 ma con l'utente corrente come directory e 1,2,3 in essa.

Quindi, se ho capito bene e vuoi creare alcune directory e al loro interno nuove directory, allora potresti farlo:

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

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


Sono d'accordo con @ gniourf_gniourf ... non ci sono usi di espressioni regolari nella tua risposta. Intendevi dire qualcos'altro o fornire un esempio diverso?
Slipp D. Thompson,

1
@gniourf_gniourf done :)
Rinzwind

3
Vale la pena ricordare che l'espansione del controvento non è definita nella shell POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/… Ad esempio non funzionerà in dashcui è l'impostazione predefinita /bin/shsu Ubuntu.
pabouk,

7
Questa risposta dipende dal fatto che la shell stia espandendo l'input prima di fornire quell'input come argomento a mkdir . È molto più preciso dire semplicemente che mkdir può creare più dir con più argomenti e poi parlare di come una determinata shell può renderlo più semplice.
deed02392,

Se provo a fare qualcosa del genere mkdir sa$(seq 0.1 0.1 1), tutto ciò che fa è creare una directory chiamata sa0.1 e il resto 0,2, 0,3, ..., 1. Come posso ottenere l'espansione del controvento decimale senza scrivere l'intero elenco?
Plinto

26

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

Websites/
  static/
      cs
      js
  templates/
      html

Puoi farlo con un singolo comando come questo:

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

Fare attenzione a non entrare negli spazi


Puoi anche premere la scheda qui per espanderli prima di eseguire il comando.
Isaac Gregson,

14

Crea un elenco dei nomi per le directory desiderate utilizzando le interruzioni di riga anziché le virgole come separatore. Salva quell'elenco.

mkdir `cat list`

Ora dovresti avere tutte le directory nominate nella tua lista.


1
Sì, funzionerà comunque con un avvertimento: i nomi delle directory devono essere una stringa intera. Se una riga è spaced dir, allora creerà due spaceddir e `dir.
Sergiy Kolodyazhnyy,

Sì - non puoi nemmeno fare con successo alcun tipo di fuga per gli spazi - junk\ dirnel listfile fornisce due directory junk\ e dir. Mi ha dato il panico quando ho visto un \ in un nome di directory.
Jon V,

Questo può essere combinato con la -pbandiera menzionata in altre risposte. In tal caso, il listfile non deve includere le directory principali come proprie righe, verranno rilevate e create automaticamente.
McW0933,

8

Qualcosa come questo? (grazie a muru per l'informazione printf)

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

Puoi avvolgerlo 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
$ 

1
Solo un printf "%s" "$1" | xargs -d, mkdirdovrebbe essere abbastanza.
Muru,

7

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

Shell + coreutils

Dato che tutti pubblicano oneliner, ecco anche il mio (mkdir + sostituzione dei parametri più + reindirizzamento della 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 è un linguaggio di elaborazione del testo, ma ha una system()funzione molto bella che chiamerà la shell predefinita ed eseguirà i comandi racchiusi tra parentesi (che deve essere una stringa).

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

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

Pitone

Il modo pitone di fare lo stesso, sarebbe quello di leggere ogni riga, sbarazzarsi del trailing \n, inserire tutto in un elenco e scorrere gli elementi dell'elenco e creare dir per elemento dell'elenco. Si noti che nell'esempio seguente, /home/xieerqi/dirList.txtè il percorso completo fornito al mio file e creiamo il percorso completo di ogni nuova directory unendo stringa /home/username/e il nome della directory letto dall'elenco. Sostituisci i tuoi valori secondo necessità

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
Non penso che chi chiede effettivamente voglia che l'elenco sia separato da virgole; Sono abbastanza sicuro che fosse solo la loro ipotesi su quale potrebbe essere la sintassi.
David Richerby,

Bene, probabilmente OP non doveva avere esattamente un elenco separato da virgole, tuttavia è sicuro che potrebbe essere usato come metodo, dato che "gli elenchi possono anche essere usati, non è necessario digitare il nome di ogni directory singolarmente". Soprattutto ciò sarà utile quando una grande lista non può essere generata con intervalli, come dir{1..1000}. Ad esempio, vuoi creare una directory per nome utente, per progetto o per posizione geografica, come una città
Sergiy Kolodyazhnyy,

1

Il comando mkdir accetta più argomenti semplicemente eseguendolo come di seguito

mkdir dir1 dir2 dir3 ... dirN

Se desideri creare più sottodirectory, puoi passare l'argomento in {} come mostrato di seguito (usa solo le virgole per separare l'argomento, senza spazi).

mkdir dir1 dir2/{subdir1,subdir2,subdir3,subdirN} dir3 dirN
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.