Núcleo do problema: seu script cd
volta para dump
, não para dump/
pai.
Na primeira iteração:
- Você começa no diretório pai de
dump
, ondedump/
existe -
dump/var1
é criado - você
cd
intodump/var1
. - quando ocorre
cd ..
, você volta paradump/
. O diretório de trabalho atual édump
e há apenasvar1
, nada mais.
Na segunda iteração:
- Quando você tenta
mkdir dump/var2/
, está emdump/
e há apenasvar1
. Odump/
dedump/var2
é o caminho inexistente. Claro que falha. Daí a mensagem de erro e, portanto, a duplicatadump/dump/var2
quando você usamkdir -p
flag. - Seu script ainda usa
cd ..
, portanto, antes do diretório de trabalho atual da 3ª iteração ser alterado dedump/
paradump/
.
Para a terceira iteração:
- Você está dentro do diretório pai de
dump/
, o caminhodump/
existe e, portanto,mkdir dump/var3
não falhará. -
cd dump/var3
ocorre, entãocd ..
e qual é o diretório de trabalho atual agora?dump/
, o nível acima dedump/var3
, em que você tenta fazermkdir dump/dump/var4
, mas há apenasvar1
evar3
, nãodump
. Omkdir
falha, vocêcd ..
, que está um nível acima dedump/
, e a coisa toda é repetida novamente.
Você pode ver isso claramente quando executar nosso script com set -x
para depuração de saída anexada após #!/bin/bash
line ou fazendo pwd
como primeiro comando em cada iteração do script.
A maneira que eu recomendaria corrigir seu script é através de cd
em dump/
primeiro e, em seguida, executar o loop for. Em outras palavras:
cd "$D"
for i in {1..24}
do
mkdir "$i"
cd "$i"
# do whatever you want inside "$i"
cd ..
done
Entre outras coisas, sugiro usar [ -d "dump" ]
em vez de -e
, porque isso ajudará a garantir que o arquivo que existe realmente seja o diretório, embora isso possa levar considerações extras.