Est-il possible de créer plusieurs répertoires à la fois avec mkdir?

86

Si je voulais créer plusieurs répertoires (sur le même niveau) puis lui donner une liste de noms de répertoires séparés par des virgules (ou quelque chose de similaire)?

    
posée BGroat 09.02.2016 - 19:30
la source

7 réponses

136

Réponse courte

mkdir prend plusieurs arguments, exécutez simplement

mkdir dir_1 dir_2
    
réponse donnée Jacob Vlijm 09.02.2016 - 19:32
la source
132

Vous pouvez utiliser des listes pour créer des répertoires et cela peut devenir assez sauvage.

Quelques exemples pour amener les gens à y penser:

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 répertoires de sa1 à sa50
  2. idem, mais chacun des répertoires contiendra 50 fois sax1 à sax50 (-p créera des répertoires parents s'ils n'existent pas.
  3. 26 répertoires de a12345 à z12345
  4. une liste séparée par des virgules crée les repères 1, 2 et 3.
  5. 10 répertoires de test01 à test10 .
  6. identique à 4 mais avec la date actuelle comme répertoire et 1,2,3 dedans.
  7. identique à 4 mais avec l'utilisateur actuel en tant que répertoire et 1,2,3 dans celui-ci.

Donc, si j'ai bien compris et que vous voulez créer des répertoires, et à l'intérieur de ceux-ci, vous pouvez le faire:

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

et obtenez sa1, sa2, ..., sa10 et dans chaque dir. 1, 2 et 3.

    
réponse donnée Rinzwind 09.02.2016 - 19:49
la source
19

C’est très simple, vous permet de créer une structure de répertoires telle que:

Websites/
  static/
      cs
      js
  templates/
      html

Vous pouvez le faire en une seule commande comme ceci:

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

Faites attention à ne pas entrer d'espaces

    
réponse donnée anas munir 23.09.2016 - 22:28
la source
14

Faites une liste des noms des répertoires de votre choix en utilisant des sauts de ligne au lieu de virgules comme séparateur. Enregistrez cette liste.

mkdir 'cat list'

Vous devriez maintenant avoir tous les répertoires nommés dans votre liste.

    
réponse donnée SpaceCadet 09.02.2016 - 23:53
la source
8

Quelque chose comme ça? (merci à muru pour le printf tip)

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

Vous pouvez l'intégrer dans une fonction pour en faciliter l'utilisation:

function mkdir_cs {
    printf '%s' "$1" | xargs -d, mkdir
}
$ ls
$ mkdir_cs 'foo,bar,baz'
$ ls
bar  baz  foo
$ 
    
réponse donnée kos 09.02.2016 - 19:49
la source
7

Vous voulez donc une liste de noms de répertoires séparée par des virgules? Cela peut être fait.

Shell + coreutils

Étant donné que tout le monde poste des marqueurs, voici le mien (mkdir + substitution de paramètre plus + redirection 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

AWK est un langage de traitement de texte, mais il possède une fonction system() qui appelle le shell par défaut et exécute la commande [s] entre parenthèses (qui doit être une chaîne).

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

Vous pouvez également supprimer , avec la fonction gsub() et appeler system("mkdir "$0) , mais cela peut poser un problème si vous souhaitez créer des répertoires avec des espaces dans leur nom

Python

La méthode pythonique consiste à lire chaque ligne, à se débarrasser de \n à la fin, à tout placer dans une liste, à parcourir les éléments de la liste et à créer des répertoires par élément. Notez que dans l'exemple ci-dessous, /home/xieerqi/dirList.txt est le chemin complet donné à mon fichier. Nous établissons le chemin complet de chaque nouveau répertoire en joignant la chaîne /home/username/ et le nom de répertoire lu dans la liste. Remplacez vos propres valeurs si nécessaire

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)
    
réponse donnée Sergiy Kolodyazhnyy 09.02.2016 - 19:44
la source
0

La commande mkdir accepte plusieurs arguments et s’exécute simplement comme ci-dessous

mkdir dir1 dir2 dir3 ... dirN

Si vous souhaitez créer plusieurs sous-répertoires, vous pouvez passer ces arguments dans {} comme indiqué ci-dessous

mkdir dir1 dir2/{subdir1, subdir2, subdir3, subdirN} dir3 dirN
    
réponse donnée Vijay Sasvadiya 20.07.2018 - 08:38
la source

Lire d'autres questions sur les étiquettes