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 bar
debajo 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 zsh
admite 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 /bar
a 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 tienenbar
subdirectorios. Punto menor pero vale la pena señalar aquí. :)${^spec}
y agregarbar
a 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
zsh
puede 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
find
yxargs
para hacerlo:que utiliza
-maxdepth 1
y-mindepth 1
para evitar la creaciónbar
en subdirectorios de objetivos, y en/tmp/foo
sí mismo respectivamente.type d
lo hace considerar solo directorios.Debe eliminar
echo
para realizar acciones reales, de lo contrarioecho
solo imprimirá líneas para ejecutar. También puede encerrarlo en sustitución$()
para ejecutarlo.Manual dice que
xargs -i
es obsoleto, pero no he encontrado ninguna otra alternativa igualmente útil, por lo que debe todavía trabajo por algunos años ... Se puede reemplazar-i
con-I'{}'
a estar al día con eso.fuente
@loa_in_ tenía la mayor parte, pero la
find
salida de la tubería tiende a ser un paso en falso.fuente
xargs
con diferentes herramientas que no tienen-exec
alternativa, así que uso mi enfoque, ya que funciona con todas ellas por igual.