¿Hay alguna manera de crear múltiples directorios a la vez con mkdir?

112

¿Si quisiera crear múltiples directorios (en el mismo nivel) y luego alimentarlo con una lista separada por comas de nombres de directorio (o algo por el estilo)?

Garganta
fuente
38
man mkdir....
Sparhawk
55
Cada vez que desee saber si un comando puede hacer algo que desea hacer, escriba manseguido del nombre del comando.
David Richerby
@DavidRicherby aunque man mkdir"tipo de" sugiere la posibilidad de crear múltiples directorios a la vez, no se menciona específicamente, ni cómo hacerlo.
Jacob Vlijm
2
@JacobVlijm La página de manual de GNU coreutils 8.21 para mkdir dice: " NOMBRE mkdir - crear directorios // SINOPSIS mkdir [OPCIÓN] ... [DIRECTORIO] ... // DESCRIPCIÓN Cree el (los) DIRECTORIO (s) si aún no existen". Parece bastante claro que puede hacer más de un directorio.
David Richerby
99
@JacobVlijm La jerga de las páginas man no es obvia sin instrucciones, pero en el lenguaje técnico de las páginas man, la información es totalmente clara, incluso en la cita dada. Tenga en cuenta el ...después [DIRECTORY], lo que significa que el argumento puede repetirse. Entonces se DIRECTORY(ies)refiere a todos los DIRECTORYargumentos pasados . Sin embargo, los comentarios "RTFM" a veces olvidan que hay una notación para aprender.
Blaisorblade

Respuestas:

147

Respuesta corta

mkdir toma múltiples argumentos, simplemente ejecuta

mkdir dir_1 dir_2
Jacob Vlijm
fuente
152

Puede usar listas para crear directorios y puede volverse bastante salvaje.

Algunos ejemplos para que la gente lo piense:

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 directorios desde sa1 hasta sa50
  2. igual pero cada uno de los directorios contendrá 50 veces sax1 a sax50 (-p creará directorios principales si no existen.
  3. 26 directorios desde a12345 hasta z12345
  4. La lista separada por comas crea los directorios 1, 2 y 3.
  5. 10 directorios de a test01través test10.
  6. igual que 4 pero con la fecha actual como directorio y 1,2,3 en él.
  7. igual que 4 pero con el usuario actual como directorio y 1,2,3 en él.

Entonces, si lo entendí correctamente y desea crear algunos directorios, y dentro de ellos nuevos directorios, entonces podría hacer esto:

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

y obtener sa1, sa2, ..., sa10 y dentro de cada directorio 1, 2 y 3.

Rinzwind
fuente
Estoy de acuerdo con @ gniourf_gniourf ... no hay usos de expresiones regulares en su respuesta. ¿Querías decir algo más o dar un ejemplo diferente?
Slipp D. Thompson
1
@gniourf_gniourf hecho :)
Rinzwind
3
Vale la pena mencionar que la expansión de llaves no está definida en el shell POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/… Por ejemplo, no funcionará, dashque es el predeterminado /bin/shen Ubuntu.
pabouk
77
Esta respuesta depende de que el shell realice la expansión de su entrada antes de proporcionar esa entrada como argumentos para mkdir . Es mucho más preciso decir que mkdir puede crear múltiples directorios con múltiples argumentos y luego hablar sobre cómo un shell determinado puede facilitarlo.
deed02392
Si intento hacer algo como mkdir sa$(seq 0.1 0.1 1), todo lo que hace es crear un directorio llamado sa0.1 y el resto 0.2, 0.3, ..., 1. ¿Cómo puedo obtener la expansión de llaves decimales sin escribir la lista completa?
Zócalo
26

Es muy simple, le permite crear una estructura de directorios como:

Websites/
  static/
      cs
      js
  templates/
      html

Puedes hacerlo en un solo comando como este:

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

Tenga cuidado de no ingresar a ningún espacio

anas munir
fuente
También puede presionar la pestaña aquí para expandirlos antes de ejecutar el comando.
Isaac Gregson
14

Haga una lista de los nombres de sus directorios deseados utilizando saltos de línea en lugar de comas como separador. Guarda esa lista.

mkdir `cat list`

Ahora debería tener todos los directorios nombrados en su lista.

Cadete del espacio
fuente
1
Sí, eso funcionará, sin embargo, con una advertencia: los nombres de directorio deben ser una cadena completa. Si una línea es spaced dir, creará dos spaceddirectorios y `dir.
Sergiy Kolodyazhnyy
Sí, tampoco puedes escapar con éxito por los espacios, junk\ diren el listarchivo se muestran dos directorios junk\ y dir. Me dio pánico cuando vi un \ nombre en el directorio.
Jon V
Esto se puede combinar con la -pbandera mencionada en otras respuestas. Si es así, el listarchivo no tiene que incluir directorios principales como sus propias líneas, se detectarán y crearán automáticamente.
mcw0933
8

¿Algo como esto? (gracias a muru por la informacion printf)

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

Puede envolverlo en una función para facilitar su uso:

function mkdir_cs {
    printf '%s' "$1" | xargs -d, mkdir
}
$ ls
$ mkdir_cs 'foo,bar,baz'
$ ls
bar  baz  foo
$ 
kos
fuente
1
Solo a printf "%s" "$1" | xargs -d, mkdirdebería ser suficiente.
muru
7

¿Entonces quieres una lista de nombres de directorio separados por comas? Eso se puede hacer.

Shell + coreutils

Como todo el mundo publica oneliners, aquí también está el mío (mkdir + sustitución de parámetros más + redirección 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 es un lenguaje de procesamiento de texto, pero tiene una system()función muy agradable que llamará al shell predeterminado y ejecutará los comandos entre paréntesis (que deben ser una cadena).

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

O puede eliminar ,con gsub()función y llamar, system("mkdir "$0)pero eso puede ser un problema si desea crear directorios con espacios en su nombre

Pitón

La forma pitónica de hacer lo mismo sería leer cada línea, deshacerse del final \n, meter todo en una lista e iterar sobre los elementos de la lista y crear directorios por elemento de la lista. Tenga en cuenta que en el ejemplo a continuación, /home/xieerqi/dirList.txtes la ruta completa dada a mi archivo, y creamos la ruta completa de cada nuevo directorio uniendo una cadena /home/username/y el nombre del directorio leído de la lista. Sustituya sus propios valores según sea necesario

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
fuente
3
No creo que el autor de la pregunta realmente quiera que la lista esté separada por comas; Estoy bastante seguro de que era solo su suposición sobre cuál podría ser la sintaxis.
David Richerby
Bueno, OP probablemente no tenía exactamente una lista separada por comas, sin embargo, es seguro que puede usarse como un método, señalando que "también se pueden usar listas, no tiene que escribir el nombre de cada directorio individualmente". Especialmente eso será útil cuando no se pueda generar una lista grande con rangos, como dir{1..1000}. Digamos que quieres hacer un directorio por nombre de usuario, por proyecto o por ubicación geográfica, como una ciudad
Sergiy Kolodyazhnyy
1

El comando mkdir toma múltiples argumentos simplemente ejecute como se muestra a continuación

mkdir dir1 dir2 dir3 ... dirN

Si desea crear varios subdirectorios, puede pasar esos argumentos en {} como se muestra a continuación (use solo comas para separar el argumento, sin espacios).

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