Tengo algo como esto:
% ls -1dF /tmp/foo/*
/tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/
/tmp/foo/002e34c2218f2c86fefd2876f0e5c2559c5fb3c4/
/tmp/foo/00b483576791bab751e6cb7ee0a7143af43a8069/
.
.
.
/tmp/foo/fedd0f7b545e7ae9600142656756456bc16874d3/
/tmp/foo/ff51ac87609012137cfcb02f36624f81cdc10788/
/tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/
Quiero crear un directorio bardebajo de cada uno de los subdirectorios debajo foo.
Si trato de hacer esto con
% mkdir -p /tmp/foo/*/bar
... me sale el error
zsh: no matches found: /tmp/foo/*/bar
(En retrospectiva, puedo entender la razón del error).
Sé que puedo resolver el problema original con un bucle for, pero tengo curiosidad por saber si zshadmite alguna forma de expansión de parámetros que produzca el argumento deseado para una sola invocación de mkdir -p. IOW, una expansión de parámetro equivalente a "agregar /bara cada prefijo generado al expandir /tmp/foo/*", lo que resulta en
% mkdir -p /tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/bar ... /tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/bar

mkdir -p, que tendría un efecto ligeramente diferente de su comando de no arrojar errores si algunos de esos directorios ya tienenbarsubdirectorios. Punto menor pero vale la pena señalar aquí. :)${^spec}y agregarbara cada elemento de lo que se/tmp/foo/*(/)expande a:set -- /tmp/foo/*(/)luegomkdir -p -- "${^@}/bar"Claro, usa un bucle
los globos se utilizan para expandir listas de elementos existentes , no cosas que aún no se han creado.
fuente
zshpuede expandir los globos y agregar texto con una sintaxis única, pero creo que es la única forma de hacer lo que quiere, @kjo.Si los directorios están en una matriz, puede usar la
${^...}forma de expansión.fuente
Puedes usar
findyxargspara hacerlo:que utiliza
-maxdepth 1y-mindepth 1para evitar la creaciónbaren subdirectorios de objetivos, y en/tmp/foosí mismo respectivamente.type dlo hace considerar solo directorios.Debe eliminar
echopara realizar acciones reales, de lo contrarioechosolo imprimirá líneas para ejecutar. También puede encerrarlo en sustitución$()para ejecutarlo.Manual dice que
xargs -ies obsoleto, pero no he encontrado ninguna otra alternativa igualmente útil, por lo que debe todavía trabajo por algunos años ... Se puede reemplazar-icon-I'{}'a estar al día con eso.fuente
@loa_in_ tenía la mayor parte, pero la
findsalida de la tubería tiende a ser un paso en falso.fuente
xargscon diferentes herramientas que no tienen-execalternativa, así que uso mi enfoque, ya que funciona con todas ellas por igual.