Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

202
Views
¿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 answers
Answer question

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 Report

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 Report

0

Sólo:

 for i in example/*/; do mkdir "$i"/a done
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!