Se o que você quer é um diretório por tipo de arquivo, então você quer algo mais como:
mkdir txt || { echo "Can't mkdir txt" ; exit 1 ; }
for file in *.txt ; do
mv -- "$file" txt/
done
Observe o tratamento de falhas em mkdir
. Em seu código, se já houver um arquivo com o nome contido na variável $dir
, seu comando mkdir --"$dir"
falhará silenciosamente e, em seguida, seu mv
comando irá sobrescrever esse arquivo.
Para lidar com vários arquivos nomeados arbitrariamente - todos os arquivos com extensões de três caracteres no diretório atual - e colocá-los em diretórios por extensão de arquivo, você pode usar o seguinte código (não testado):
for file in *.??? ; do
[ -f "$file" ] || continue
dir="$(echo "$file" | rev | cut -c-3 | rev)"
mkdir -p "$dir" || { echo "Couldn't mkdir -p $dir; exiting" ; exit 1 ; }
mv -- "$file" "$dir"
done
Explicação:
O padrão *.???
corresponderá a todos os arquivos e diretórios no diretório atual cujo nome termine em um período ( .
) seguido por exatamente três caracteres.
O teste [ -f "$file" ]
retornará verdadeiro somente se $file
for um arquivo regular (não um diretório ou outro tipo mais especializado como um dispositivo). Caso contrário, a instrução continue
ignorará o restante da passagem pela for
loop.
A atribuição à variável dir
parece chique, mas na verdade apenas pega o conteúdo da variável $file
, inverte-a, extrai os 3 primeiros caracteres (da string invertida), inverte-a novamente e atribui a variável resultar como o valor de $dir
. Em outras palavras, são os três últimos caracteres do nome do arquivo.
Em seguida, mkdir -p
retornará sucesso se o diretório já existir ou será criado se não existir (e retornar sucesso). Se não retornar sucesso, você não quer tentar mover arquivos para ele! Daí o tratamento de erros.
Em seguida, o comando mv
é igual ao normal.
Uma nota sobre o tratamento de erros:
Você pode ver construções como esta:
mkdir -p "$dir" || echo "Failed, exiting" && exit 1
Isso é imperfeito porque o comando exit
só é executado se o comando echo
tiver êxito após a falha do comando mkdir
. O que você deseja, em vez disso, é ter o comando exit
executado independentemente de se o comando echo
é bem-sucedido, supondo que mkdir
falhou. É por isso que uso as chaves como acima.