com zsh
:
dirs=(*(/))
mkdir -- $^dirs/doc
touch -- $^dirs/doc/doc1.txt
(/)
é um qualificador globbing , /
significa selecionar apenas diretórios.
$^array
(que lembra o rc
do operador ^
) é ativar um tipo de expansão do tipo chave no array, portanto $^array/foo
é como {elt1,elt2,elt3}/doc
(onde elt1
, elt2
, elt3
são os elementos da matriz).
Também se pode fazer:
mkdir -- *(/e:REPLY+=/doc:)
touch -- */doc(/e:REPLY+=/doc1.txt:)
Em que e
é outro qualificador de globbing que executa determinado código no arquivo a ser selecionado.
Com rc
/ es
/ akanga
:
dirs = */
mkdir -- $dirs^doc
touch -- $dirs^doc/doc1.txt
Isso está usando o operador ^
, que é como um operador de concatenação aprimorada.
rc
não suporta qualificadores */
expande para todos os diretórios e links simbólicos para diretórios , com /
anexado.
com tcsh
:
set dirs = */
mkdir -- $dirs:gs:/:/doc::q
touch -- $dirs:gs:/:/doc/doc1.txt::q
Os :x
são modificadores de histórico que também podem ser aplicados a expansões variáveis. :gs
é para substituto global. :q
cita as palavras para evitar problemas com alguns caracteres.
Com zsh
ou bash
:
dirs=(*/)
mkdir -- "${dirs[@]/%/doc}"
touch -- "${dirs[@]/%/doc/doc1.txt}"
${var/pattern/replace}
é o operador substituto em shells semelhantes a Korn. Com ${array[@]/pattern/replace}
, é aplicado a cada elemento da matriz. %
significa no final .
Várias considerações:
dirs=(*/)
inclui diretórios e links simbólicos para diretórios (e não há como excluir links simbólicos diferentes de usar [ -L "$file" ]
em um loop), enquanto dir=(*(/))
(extensão zsh) inclui diretórios ( dir=(*(-/))
para incluir links simbólicos para diretórios sem adicionar a barra final).
Eles excluem diretórios ocultos. Cada shell tem uma opção específica para incluir arquivos ocultos).
Se o diretório atual é gravável por outros, você potencialmente tem problemas de segurança. Como se poderia criar um symlink para fazer com que você crie dirs ou arquivos onde você não gostaria. Mesmo com soluções que não consideram links simbólicos, ainda há uma condição de corrida, pois é possível substituir um diretório por um link simbólico entre o dirs=(*/)
e o mkdir...
.