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


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 à cet effet)?


79
2018-02-09 18:30


origine


man mkdir.... - Sparhawk
Chaque fois que vous voulez savoir si une commande peut faire quelque chose que vous voulez faire, tapez man suivi du nom de la commande. - David Richerby
@JacobVlijm La page de manuel GNU coreutils 8.21 pour mkdir indique: "PRÉNOM mkdir - crée des répertoires // SYNOPSIS  mkdir [OPTION] ... [ANNUAIRE] ... // LA DESCRIPTION Créez le (s) répertoire (s) s'ils n'existent pas déjà. "Cela semble assez clair, vous pouvez créer plusieurs répertoires. - David Richerby
@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 totalement claires, même dans la citation donnée. Noter la ... après [DIRECTORY], ce qui signifie que l'argument peut être répété. Alors DIRECTORY(ies) se réfère à tous passés DIRECTORY arguments. Cependant, les commentaires "RTFM" oublient parfois qu'il y a une notation à apprendre. - Blaisorblade
@Blaisorblade Merci! c'est informatif! - Jacob Vlijm


Réponses:


Réponse courte

mkdir prend plusieurs arguments, lancez simplement

mkdir dir_1 dir_2

131
2018-02-09 18:32





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

Quelques exemples pour faire réfléchir les gens:

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 annuaires de sa1 à sa50
  2. idem mais chacun des répertoires contiendra 50 fois sax1 à sax50 (-p créera les répertoires parents s’ils n’existent pas.
  3. 26 répertoires de 12345 à z12345
  4. La liste séparée par des virgules crée les répertoires 1, 2 et 3.
  5. 10 répertoires de test01 par 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 je l'ai bien compris et que vous voulez créer des répertoires, et à l'intérieur de ces nouveaux répertoires, vous pouvez le faire:

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

et obtenir sa1, sa2, ..., sa10 et dans chaque dirs 1, 2 et 3.


125
2018-02-09 18:49



Je suis d'accord avec @ gniourf_gniourf… il n'y a pas d'usage d'expressions régulières dans votre réponse. Voulez-vous dire autre chose ou donner un autre exemple? - Slipp D. Thompson
@gniourf_gniourf fait :) - Rinzwind
Il convient de mentionner que l'extension d'accolade n'est pas définie dans le shell POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/… Par exemple, cela ne fonctionnera pas dans dash qui est le défaut /bin/sh sur Ubuntu. - pabouk
Cette réponse dépend de l’extension du shell de votre entrée avant de fournir cette entrée comme arguments à mkdir. Il est beaucoup plus juste de dire que mkdir peut créer plusieurs répertoires avec plusieurs arguments et puis parler de la façon dont un shell donné peut rendre cela plus facile. - deed02392
Si j'essaye de faire quelque chose comme 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 l'extension d'accolades décimales sans écrire la liste entière? - Plinth


C'est très simple, vous permet de créer une structure de répertoire 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}

Veillez à ne pas entrer d'espaces


17
2017-09-23 20:28



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


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.


12
2018-02-09 22:53



Joli. Ne pense pas que j'ai vu celui-là avant: D +1 - Rinzwind
Oui, cela fonctionnera toutefois avec un avertissement - 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, spaced et `dir. - Sergiy Kolodyazhnyy
Ouais - vous ne pouvez même pas réussir à échapper aux espaces - junk\ dir dans le list fichier donne deux répertoires, junk\  et dir. M'a donné une panique quand j'ai vu un \  dans un nom de répertoire. - Jon V
Cela peut être combiné avec le -p drapeau mentionné dans les autres réponses. Si oui, le list fichier ne doit pas inclure les répertoires parents comme leurs propres lignes, ils seront détectés et créés automatiquement. - mcw0933


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

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

Vous pouvez l'envelopper dans une fonction pour faciliter son utilisation:

function mkdir_cs {
    printf '%s' "$1" | xargs -d, mkdir
}
$ ls
$ mkdir_cs 'foo,bar,baz'
$ ls
bar  baz  foo
$ 

8
2018-02-09 18:49



Juste un printf "%s" "$1" | xargs -d, mkdir Cela devrait suffire. - muru


Donc, vous voulez une liste de noms de répertoires séparés par des virgules? Cela peut être fait.

Shell + coreutils

Comme tout le monde affiche des oneliners, voici le mien (mkdir + substitution de paramètres 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 est très agréable system() fonction qui appellera le shell par défaut et exécutera 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 pourriez enlever , avec gsub() fonction et appel system("mkdir "$0) mais cela peut être un problème si vous voulez créer des répertoires avec des espaces dans leur nom

Python

La manière pythonique de faire la même chose serait de lire chaque ligne, de se débarrasser de \n , placez le tout dans une liste et parcourez les éléments de la liste et créez des répertoires par élément de liste. Notez que dans l'exemple ci-dessous, /home/xieerqi/dirList.txt est le chemin complet donné à mon fichier, et nous construisons 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
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)

7
2018-02-09 18:44



Je ne pense pas que le demandeur en fait veut la liste doit être séparée par des virgules; Je suis sûr que c'était juste leur idée de ce que pourrait être la syntaxe. - David Richerby
Eh bien, il est probable que OP n’a pas exactement de liste séparée par des virgules, mais il est certain qu’elle peut être utilisée comme méthode. Surtout qui sera utile quand une grande liste ne peut pas être générée avec des plages, comme dir{1..1000}. Disons que vous voulez créer un répertoire par nom d'utilisateur ou par projet, ou par emplacement géographique, comme une ville - Sergiy Kolodyazhnyy


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.

mkdir dir1 dir2/{subdir1, subdir2, subdir3, subdirN} dir3 dirN

0
2017-07-20 06:38