Existe de fato uma condição de corrida (uma que não causaria danos, no entanto).
O *
é expandido na entrada do loop. Se você executar uma segunda instância desse script simultaneamente, provavelmente não fará nada porque todos os arquivos que ele tenta mover já foram movidos. Se nenhum arquivo for criado no diretório de origem durante a operação de movimentação, as mensagens de erro deverão ser seu maior problema.
Mas, em geral, essa estrutura é uma ideia muito ruim. *
se expande para uma lista classificada. AFAIK não é possível desativar isso. Obviamente, a classificação sozinha é um pesadelo com 400 mil arquivos. Veja man bash
, seção "Expansão do nome do caminho":
After word splitting, unless the -f option has been set, bash scans each word for the characters *, ?, and [. If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of file names matching the pattern.
Além disso, você não deve executar uma mv
instância por arquivo, pois pode mover vários arquivos de uma só vez.
Esta é uma solução melhor (no mundo GNU):
find . -mindepth 1 -maxdepth 1 -exec mv --target-directory=DIRECTORY {} +