Um curinga sempre se expande para nomes existentes .
Seu comando mkdir *falha porque os nomes que *se expandem para já existem.
Seu comando mkdir *.d"falha" porque *.dnão corresponde a nenhum nome existente. O padrão, portanto, não é expandido por padrão 1 e um diretório chamado *.dé criado. Você pode remover isso com rmdir '*.d'.
Para criar um diretório para cada arquivo regular no diretório atual, para que os novos diretórios tenham o mesmo nome dos arquivos, mas com um .dsufixo:
for name in ./*; do
if [ -f "$name" ]; then
# this is a regular file (or a symlink to one), create directory
mkdir "$name.d"
fi
done
ou, para pessoas que gostam de "one-liners",
for n in ./*; do [ -f "$n" ] && mkdir "$n.d"; done
Em bash, você também pode fazer
names=( ./* )
mkdir "${names[@]/%/.d}"
mas isso não verifica se as coisas para as quais o glob se expande são arquivos regulares ou outra coisa.
As iniciais ./nos comandos acima são para proteger contra nomes de arquivos que contenham um traço inicial ( -) em seus nomes de arquivos. O traço e os caracteres que o seguem seriam interpretados como opções para mkdir.
1 Alguns shells têm uma nullglobopção de shell que faz com que caracteres curinga de shell não correspondidos sejam expandidos para uma string vazia. Neste bashé habilitado usando shopt -s nullglob.
*.dexpande para os arquivos cujo nome termina em .d.
Com zsh, você poderia fazer:
files=(*)
mkdir -- $^files.d
Ou com uma função anônima:
() { mkdir -- $^argv.d; } *
Ou adicionando o sufixo por meio do equalificador glob:
mkdir -- *(e{REPLY+=.d})
Ou o :smodificador de histórico aplicado a globs (com histsubstpatternfor %to mean end ):
set -o histsubstpattern
mkdir -- *(:s/%/.d)
Você também pode querer não fazer isso para arquivos que já são diretórios ou links simbólicos para diretórios, adicionando um ^-/qualificador glob:
files=(*(^-/))
mkdir -- $^files.d
(observe que zshnão possui esse recurso incorreto de outros shells do tipo Bourne, onde os padrões que não correspondem são passados como estão, portanto mkdir *.d, não criaria um *.ddiretório se não houvesse nenhum arquivo correspondente *.dno diretório atual, abortaria o comando com um erro em vez)
Um curinga sempre se expande para nomes existentes .
Seu comando
mkdir *
falha porque os nomes que*
se expandem para já existem.Seu comando
mkdir *.d
"falha" porque*.d
não corresponde a nenhum nome existente. O padrão, portanto, não é expandido por padrão 1 e um diretório chamado*.d
é criado. Você pode remover isso comrmdir '*.d'
.Para criar um diretório para cada arquivo regular no diretório atual, para que os novos diretórios tenham o mesmo nome dos arquivos, mas com um
.d
sufixo:ou, para pessoas que gostam de "one-liners",
Em
bash
, você também pode fazermas isso não verifica se as coisas para as quais o glob se expande são arquivos regulares ou outra coisa.
As iniciais
./
nos comandos acima são para proteger contra nomes de arquivos que contenham um traço inicial (-
) em seus nomes de arquivos. O traço e os caracteres que o seguem seriam interpretados como opções paramkdir
.1 Alguns shells têm uma
nullglob
opção de shell que faz com que caracteres curinga de shell não correspondidos sejam expandidos para uma string vazia. Nestebash
é habilitado usandoshopt -s nullglob
.*.d
expande para os arquivos cujo nome termina em.d
.Com
zsh
, você poderia fazer:Ou com uma função anônima:
Ou adicionando o sufixo por meio do
e
qualificador glob:Ou o
:s
modificador de histórico aplicado a globs (comhistsubstpattern
for%
to mean end ):Você também pode querer não fazer isso para arquivos que já são diretórios ou links simbólicos para diretórios, adicionando um
^-/
qualificador glob:(observe que
zsh
não possui esse recurso incorreto de outros shells do tipo Bourne, onde os padrões que não correspondem são passados como estão, portantomkdir *.d
, não criaria um*.d
diretório se não houvesse nenhum arquivo correspondente*.d
no diretório atual, abortaria o comando com um erro em vez)Em vez de
for foo in bar; do baz; done
solução, eu proporia:find . -maxdepth 1 -type f -print0|xargs -0 -I file mkdir file.d