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

112

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

Gorge
la source
38
man mkdir....
Sparhawk
5
Chaque fois que vous voulez savoir si une commande peut faire quelque chose que vous voulez faire, tapez mansuivi du nom de la commande.
David Richerby
@DavidRicherby bien que man mkdir"en quelque sorte" suggère la possibilité de créer plusieurs répertoires à la fois, il n'est pas mentionné spécifiquement, ni comment le faire.
Jacob Vlijm
2
@JacobVlijm La page de manuel GNU coreutils 8.21 pour mkdir indique: " NOM mkdir - crée des répertoires // SYNOPSIS mkdir [OPTION] ... [REPERTOIRE] ... // DESCRIPTION Créez le ou les RÉPERTOIRES s'ils n'existent pas déjà." Cela semble assez clair que vous pouvez créer plusieurs répertoires.
David Richerby
9
@JacobVlijm Le jargon des pages de manuel n'est pas évident sans instructions, mais dans le langage technique des pages de manuel, les informations sont parfaitement claires, même dans la citation donnée. Notez le point ...suivant [DIRECTORY], ce qui signifie que cet argument peut être répété. Donc, DIRECTORY(ies)fait référence à tous les DIRECTORYarguments passés . Cependant, les commentaires "RTFM" oublient parfois qu'il existe une notation à apprendre.
Blaisorblade

Réponses:

147

Réponse courte

mkdir prend plusieurs arguments, lancez simplement

mkdir dir_1 dir_2
Jacob Vlijm
la source
152

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 tiendra 50 fois sax1 à sax50 (-p créera des répertoires parents s’ils n’existent pas.
  3. 26 annuaires de a12345 à z12345
  4. Une liste séparée par des virgules fait les dir. 1, 2 et 3.
  5. 10 annuaires de test01par test10.
  6. identique à 4 mais avec la date actuelle comme répertoire et 1,2,3 dans celui-ci.
  7. identique à 4 mais avec l'utilisateur actuel comme 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 nouveaux répertoires, vous pouvez faire ceci:

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

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

Rinzwind
la source
Je suis d'accord avec @ gniourf_gniourf… il n'y a pas d'utilisation des expressions régulières dans votre réponse. Vouliez-vous dire autre chose ou donner un exemple différent?
Slipp D. Thompson
1
@gniourf_gniourf done :)
Rinzwind 10/02/2016
3
Il est à noter que l'expansion d'accolade n'est pas définie dans le shell POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/… Par exemple, cela ne fonctionnera pas, car c'est dashla valeur par défaut /bin/shpour Ubuntu.
Pabouk
7
Cette réponse dépend du shell qui étendra votre entrée avant de fournir cette entrée en tant qu'argument à mkdir . Il est beaucoup plus précis de dire que mkdir peut créer plusieurs répertoires avec plusieurs arguments, puis de parler de la façon dont un shell peut faciliter cela.
deed02392
Si j'essaie de faire quelque chose du genre mkdir sa$(seq 0.1 0.1 1), tout ce qu'il fait est de créer un répertoire nommé sa0.1 et le reste 0.2, 0.3, ..., 1. Comment puis-je obtenir une expansion décimale sans écrire la totalité de la liste?
Plinth
26

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}

Attention à ne pas entrer dans les espaces

Anas Munir
la source
Vous pouvez également appuyer sur l'onglet ici pour les développer avant d'exécuter la commande.
Isaac Gregson
14

Faites une liste des noms de vos répertoires souhaités 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.

SpaceCadet
la source
1
Oui, cela fonctionnera toutefois avec une réserve - les noms de répertoires doivent être une chaîne entière. Si une ligne est spaced dir, alors il va créer deux répertoires, spacedet `dir.
Sergiy Kolodyazhnyy
Ouais - vous ne pouvez même pas réussir à échapper aux espaces - junk\ dirle listfichier donne deux répertoires junk\ et dir. M'a donné la panique quand j'ai vu un \ dans un nom de répertoire.
Jon V
Ceci peut être combiné avec le -pdrapeau mentionné dans d'autres réponses. Si tel est le cas, le listfichier n'a pas à inclure les répertoires parents dans leurs propres lignes, ils seront détectés et créés automatiquement.
mcw0933
8

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

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

Vous pouvez envelopper dans une fonction pour la facilité d'utilisation:

function mkdir_cs {
    printf '%s' "$1" | xargs -d, mkdir
}
$ ls
$ mkdir_cs 'foo,bar,baz'
$ ls
bar  baz  foo
$ 
kos
la source
1
Juste un printf "%s" "$1" | xargs -d, mkdirdevrait suffire.
muru
7

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

Shell + coreutils

Puisque tout le monde publie des annonces, voici le mien également (mkdir + substitution de paramètre plus + redirection de 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 est un langage de traitement de texte, mais il a une system()fonction très pratique qui appelle le shell par défaut et exécute la commande [s] entre parenthèses (qui doit être une chaîne).

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

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

Python

Une façon pythonique de faire la même chose serait de lire chaque ligne, de se débarrasser de la fin \n, de tout placer dans une liste, de parcourir les éléments de la liste et de créer des répertoires par élément de la liste. Notez que dans l'exemple ci-dessous, /home/xieerqi/dirList.txtest le chemin complet donné à mon fichier, et nous construisons le chemin complet de chaque nouveau répertoire en joignant chaîne /home/username/et le nom de répertoire lu dans liste. Remplacez vos propres valeurs si nécessaire

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)
Sergiy Kolodyazhnyy
la source
3
Je ne pense pas que le demandeur souhaite réellement que la liste soit séparée par des virgules; Je suis à peu près sûr que c'était juste leur conjecture sur ce que pourrait être la syntaxe.
David Richerby
Eh bien, OP n’avait probablement pas exactement une liste séparée par des virgules, mais il est certain que vous pouvez l’utiliser comme méthode, car vous pouvez utiliser "des listes, vous n’aurez pas à taper le nom de chaque répertoire individuellement". Cela sera particulièrement utile lorsqu'une grande liste ne peut pas être générée avec des plages, comme dir{1..1000}. Dites, vous voulez faire un répertoire par nom d'utilisateur, ou par projet, ou par emplacement géographique, comme une ville
Sergiy Kolodyazhnyy 10/02/2016
1

La commande mkdir prend plusieurs arguments 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 (utilisez uniquement des virgules pour séparer les arguments, sans espaces).

mkdir dir1 dir2/{subdir1,subdir2,subdir3,subdirN} dir3 dirN
Vijay Sasvadiya
la source