Um curinga sempre se expande para os nomes existentes .
Seu comando mkdir *
falha porque os nomes que *
expande já existem.
Seu comando mkdir *.d
"falha" porque o *.d
não corresponde a nenhum nome existente. Portanto, o padrão é deixado 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 sufixo .d
:
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 faz verificações se as coisas para as quais a glob se expande são arquivos regulares ou qualquer outra coisa.
Os ./
iniciais nos comandos acima são para proteger contra nomes de arquivos que contêm um traço inicial ( -
) em seus nomes de arquivos. O traço e os caracteres seguintes seriam interpretados como opções para mkdir
.
1 Alguns shells têm uma opção nullglob
shell que faz com que os curingas de shell não correspondidos sejam expandidos para uma string vazia. Em bash
, isso é ativado usando shopt -s nullglob
.