Eu tenho algo parecido com isto:
% ls -1dF /tmp/foo/*
/tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/
/tmp/foo/002e34c2218f2c86fefd2876f0e5c2559c5fb3c4/
/tmp/foo/00b483576791bab751e6cb7ee0a7143af43a8069/
.
.
.
/tmp/foo/fedd0f7b545e7ae9600142656756456bc16874d3/
/tmp/foo/ff51ac87609012137cfcb02f36624f81cdc10788/
/tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/
Eu quero criar um diretório bar
em cada um dos subdiretórios em foo
.
Se eu tentar fazer isso com
% mkdir -p /tmp/foo/*/bar
... eu recebo o erro
zsh: no matches found: /tmp/foo/*/bar
(Em retrospectiva, eu posso entender o motivo do erro.)
Eu sei que posso resolver o problema original com um loop for, mas estou curioso para saber se zsh
suporta alguma forma de expansão de parâmetro que produziria o argumento desejado para uma única chamada de mkdir -p
. IOW, uma expansão de parâmetro equivalente a "anexar /bar
a cada prefixo gerado pela expansão /tmp/foo/*
", resultando em
% mkdir -p /tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/bar ... /tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/bar
mkdir -p
, o que teria um efeito ligeiramente diferente do seu comando de não gerar erros se alguns desses diretórios já tiverembar
subdiretórios. Ponto menor, mas vale a pena notar aqui. :)${^spec}
e acrescentarbar
a cada elemento do que quer que/tmp/foo/*(/)
se expande para:set -- /tmp/foo/*(/)
entãomkdir -p -- "${^@}/bar"
Claro - use um loop
globs são usados para expandir listas de itens existentes , não coisas que ainda não foram criadas.
fonte
zsh
possível expandir os globs e anexar texto com uma única sintaxe - mas acho que é provavelmente a única maneira de fazer o que você quer, @kjo.Se os diretórios estiverem em uma matriz, você poderá usar a
${^...}
forma de expansão.fonte
Você pode usar
find
exargs
fazer isso:que usa
-maxdepth 1
e-mindepth 1
impede a criação debar
subdiretórios de destinos e, por/tmp/foo
si só, respectivamente.type d
faz considerar apenas diretórios.Você precisa remover
echo
para executar ações reais, caso contrárioecho
, apenas imprimirá linhas a serem executadas. Você também pode incluí-lo em substituição, como$()
para executá-lo.O manual diz que
xargs -i
está obsoleto, mas não encontrei outra alternativa igualmente útil, por isso ainda deve funcionar por alguns anos ... Você pode substituir-i
por-I'{}'
para estar atualizado com isso.fonte
O @loa_in_ teve a maior parte, mas a
find
produção da tubulação tende a ser um passo em falso.fonte
xargs
com ferramentas diferentes que não têm-exec
alternativa, então uso minha abordagem, pois ela trabalha com todas igualmente.