Criando diretórios com script Bash

1

Eu tenho o seguinte script bash para criar um conjunto de diretórios, mover para esse diretório, executar algumas ações (não mostradas) e voltar para o diretório pai:

#!/bin/bash
if [ -e 'dump' ]; then
        rm -r dump
        mkdir dump
        D="dump/var"
else
        mkdir dump
        D="dump/var"
fi

for d in {1..24}

do
echo $D$d
mkdir $D$d/
cd $D$d
cd ..

done

Quando este script é executado, o resultado é que os diretórios de numeração ímpar são feitos enquanto os diretórios de número par lançam o erro 'Nenhum arquivo ou diretório'. Se eu colocar a opção de criar um diretório pai, como em mkdir -p $D$d/ , um diretório aninhado resultará em dump/var1 , dump/dump/var2 , dump/dump/dump/var3 , et cetera.

Se eu remover as alterações de diretório, cd $D$d e cd .. , o script será executado sem erro. Se eu usar caminhos absolutos para o diretório, como em D="/path/to/directory/dump/var" , haverá "Nenhum arquivo ou diretório" para todos, exceto o primeiro diretório criado.

O que está acontecendo no shell?

    
por David Ollodart 14.05.2018 / 19:07

1 resposta

2

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 , onde dump/ existe
  • dump/var1 é criado
  • você cd into dump/var1 .
  • quando ocorre cd .. , você volta para dump/ . O diretório de trabalho atual é dump e há apenas var1 , nada mais.

Na segunda iteração:

  • Quando você tenta mkdir dump/var2/ , está em dump/ e há apenas var1 . O dump/ de dump/var2 é o caminho inexistente. Claro que falha. Daí a mensagem de erro e, portanto, a duplicata dump/dump/var2 quando você usa mkdir -p flag.
  • Seu script ainda usa cd .. , portanto, antes do diretório de trabalho atual da 3ª iteração ser alterado de dump/ para dump/ .

Para a terceira iteração:

  • Você está dentro do diretório pai de dump/ , o caminho dump/ existe e, portanto, mkdir dump/var3 não falhará.
  • cd dump/var3 ocorre, então cd .. e qual é o diretório de trabalho atual agora? dump/ , o nível acima de dump/var3 , em que você tenta fazer mkdir dump/dump/var4 , mas há apenas var1 e var3 , não dump . O mkdir falha, você cd .. , que está um nível acima de dump/ , 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.

    
por Sergiy Kolodyazhnyy 14.05.2018 / 19:25