Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

196
Vistas
¿Cómo creo el mismo directorio en todos los subdirectorios en bash?

He estado intentando crear el directorio "a" dentro de todos los subdirectorios de "ejemplo".

Lo que probé es lo siguiente:

 mkdir example/*/a

Pero no toma el '*' como comodín, devolviendo mkdir: no se puede crear el directorio «example/*/a»: No existe archivo o directorio

Tenga en cuenta que tengo demasiados subdirectorios en el ejemplo, por lo que no puedo hacerlo creando una lista.

No quiero hacerlo con bucles for, porque estoy aprendiendo bash y no tengo permitido usar bucles. Probablemente, no hay forma de evitar un bucle for, en ese caso, por favor dígame :).

Gracias.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Probablemente, no hay forma de evitar un bucle for

Puedes usar find :

 find example -type d -not -name a -exec mkdir -p {}/a \;
over 4 years ago · Santiago Trujillo Denunciar

0

Tratar:

 dirs=( example/*/ ) mkdir -v "${dirs[@]/%/a}"
  • dirs=( example/*/ ) crea una matriz de todos los subdirectorios de example ( (example/dir1/ example/dir2/ ...) ).
  • "${dirs[@]/%/a}" se expande a una lista que contiene todos los elementos de dirs con a agregado a cada uno de ellos ( (example/dir1/a example/dir2/a ...) ).

Si tiene una gran cantidad de subdirectorios, mkdir en el código anterior puede fallar con un error de "Lista de argumentos demasiado larga". Consulte Error de lista de argumentos demasiado larga para comandos rm, cp, mv .

Una forma de evitar el problema es pasar una lista terminada en NUL de los directorios que se crearán a xargs -0 :

 dirs=( example/*/ ) printf '%s\0' "${dirs[@]/%/a}" | xargs -0 mkdir -v

Eso, si es necesario, ejecutará múltiples comandos mkdir , cada uno con una lista de argumentos que no exceda el límite.

Sin embargo, si la cantidad de directorios es tan grande, es posible que tenga problemas de rendimiento debido a que Bash (innecesariamente, pero inevitablemente) ordena la lista producida por example/*/ ). En ese caso, sería mejor usar find . Una forma de hacerlo es:

 find example -maxdepth 1 -mindepth 1 -type d -printf '%p/a\0' | xargs -0 mkdir -v

find tiene soporte incorporado para el comportamiento similar a xargs con -exec ... + . Sin embargo, es un poco complicado de usar en este caso. Lo mejor que se me ocurre en un apuro es:

 find example -maxdepth 1 -mindepth 1 -type d \ -exec bash -c 'mkdir -v "${@/%//a}"' bash {} +

Dado que agrega /a a todos los argumentos pasados a bash por find antes de ejecutar mkdir en ellos, puede encontrar un error de "Lista de argumentos demasiado larga" de todos modos. Lo dejaré aquí porque ilustra una técnica a veces útil, pero recomiendo no usarla.

over 4 years ago · Santiago Trujillo Denunciar

0

Sólo:

 for i in example/*/; do mkdir "$i"/a done
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda