Manera automatizada de crear un árbol de directorios

11

Estoy tratando de hacer un árbol de directorios de la A a la Z donde el siguiente directorio está dentro del directorio actual.

Por ejemplo: B está dentro de A y C está dentro de B y así sucesivamente.

-A
--B
---C
----...Z

¿Alguna pista sobre cómo hacerlo de forma automática?

Nish
fuente
Me pregunto cuál es el propósito práctico de tales directorios. En mi humilde opinión esto se parece más a una pregunta para Code Golf .
Melebius
3
@Melebius Un posible propósito es crear una estructura de directorio como un caso de prueba, para ayudar a verificar que algún otro comando, script o propiedad de la aplicación funcione. Aquí hay una instancia reciente en la que la pregunta en sí misma no era sobre la creación de estructuras de directorios específicas, sino que saber cómo escribir comandos para hacerlo era útil para fines de prueba, no a pesar de cómo la estructura específica era artificial y extraña, sino por eso. (También tenemos muchas preguntas sobre la creación de estructuras de directorios específicas, que se pueden encontrar buscando " mkdir -p".)
Eliah Kagan

Respuestas:

25

Con mkdir, printfy la expansión de llaves de bash:

$ mkdir -p "$(printf "%s/" {A..Z})"
$ tree A
A
└── B
    └── C
        └── D
            └── E
                └── F
                    └── G
                        └── H
                            └── I
                                └── J
                                    └── K
                                        └── L
                                            └── M
                                                └── N
                                                    └── O
                                                        └── P
                                                            └── Q
                                                                └── R
                                                                    └── S
                                                                        └── T
                                                                            └── U
                                                                                └── V
                                                                                    └── W
                                                                                        └── X
                                                                                            └── Y
                                                                                                └── Z

25 directories, 0 files
  • {A..Z}se expande a A B ... Z,
  • printf "%s/"imprime los argumentos con un /después de ellos, así que obtengoA/B/...Z/
  • y mkdir -pcrea el A/B/.../Zdirectorio con cualquier directorio padre que haya que crear.
muru
fuente
gracias por eso. Pensé que obtengo este error mientras. Uso el comando mkdir: A / B / C / D / E / F / G / H / I / J / K / L / M / N / O / P / Q / R / S / T / U / V / W / X / Y: No existe tal archivo o directorio
Nish
3
@Nish Hay un -pen el mkdircomando.
muru
mal, lo intenté en mi mac en lugar de ubuntu. Y una pregunta de seguimiento es esta -> digamos que quería tener el directorio A1..A100 dentro de A (en la misma estructura AtoZ). Luego B1..B100 dentro de B. Entonces se ve algo como esto -> imgur.com/jfuKEdf
Nish
11
Supongamos que publica un seguimiento como una pregunta real en lugar de en los comentarios, y no utiliza imágenes sino texto. Eso sería mucho mejor, ¿no?
muru
Entiendo tu punto aquí. Es difícil publicarlo, ya que no es un código y es una salida enorme. Por lo tanto, simplemente mirar la captura de pantalla hace que sea más fácil de entender.
Nish
7

En un nivel muy simple, puede hacer uso de la {A..Z}expansión para generar todas las letras, luego hacer e ingresar iterativamente cada una:

~/test_directory$ for d in {A..Z}; do mkdir "$d"; cd "$d"; done
~/test_directory/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z$ 

Como puede ver en mi mensaje de salida, ahora tiene un directorio completamente encadenado.

Sin embargo, si los nombres de directorio reales son diferentes al alfabeto, tendrá que proporcionar de alguna manera la lista de nombres de directorio, tal vez a través de un archivo, sobre el cual iterará y volverá a realizar el mismo proceso. Básicamente, esto

while IFS= read -r dir_name;do mkdir "$dir_name"; cd "$dir_name" ;done < directory_list.txt
Sergiy Kolodyazhnyy
fuente
eso es muy bonito. Aquí hay una pregunta de seguimiento. Digamos que quería tener el directorio A1..A100 dentro de A (en la misma estructura AtoZ). Luego B1..B100 dentro de B. Así que se ve algo como esto -> imgur.com/jfuKEdf
Nish
@Nish ah, eso requeriría un bucle interno, así quefor d in {A..Z}; do mkdir "$d"; cd "$d"; for i in {1..100}; do mkdir "${d}${i}" ;done ; done
Sergiy Kolodyazhnyy
O incluso sin lazo interno,for d in {A..Z}; do mkdir "$d"; cd "$d"; mkdir "$d"{1..100}; done
Sergiy Kolodyazhnyy
gracias por eso. Parece funcionar, pero el orden del directorio parece estar jodido, por lo que 2 no es posterior a 1. Se ordena al azar. ¿Alguna manera de arreglar eso? Aquí hay una captura de pantalla -> imgur.com/a/Zqj1c
Nish
@Nish El orden de clasificación está basado en texto, no numérico como creo que espera. En cuanto a tree, no estoy seguro de cómo solucionarlo, pero creo que esto ni siquiera podría ser treeun problema, sino más bien el orden de clasificación de Shell. Sugeriría hacer una pregunta real sobre eso aquí o mejor aún en unix.stackexchange.com
Sergiy Kolodyazhnyy
2

Aunque el printfcamino de Muru no puede ser mejor, personalmente me gusta joteste tipo de cosas. jotno está instalado por defecto en Ubuntu. El athena-jotpaquete lo proporciona. Cualquiera de estos comandos funciona:

mkdir -p "$(jot -s/ -c 26 A)"
jot -s/ -c 26 A | xargs mkdir -p

Realmente, cualquier comando que genere la secuencia de letras y las combine con barras inclinadas facilitará esto, ya que su salida se puede pasar a mkdir -ptravés de la sustitución de comandos (como en la respuesta de muru ) o usando xargs. Aquí hay algunos ejemplos que usan algunas herramientas y xargsque no requieren que instales software, excepto quizás en sistemas muy mínimos o Ubuntu Core:

perl -we 'print join "/", A..Z' | xargs mkdir -p
ruby -we 'print (?A..?Z).to_a * ?/' | xargs mkdir -p
python3 -c 'print("/".join(__import__("string").ascii_uppercase))' | xargs mkdir -p

Las versiones anteriores de Ubuntu vienen con Python 2 en lugar de Python 3. Para eso, simplemente cambie python3a pythonpara hacer que el último comando funcione, si realmente desea hacer esto con Python.

Del mismo modo, la forma corta y simple de muru se puede escribir alternativamente:

printf '%s/' {A..Z} | xargs mkdir -p

El seguimiento /, en la ruta del directorio que mkdir -pse le pide que cree, no es un problema y podría decirse que es preferible estilísticamente. Pero está bien omitirlo, como lo hacen los otros ejemplos en esta respuesta.

Eliah Kagan
fuente