5
respostas

Pastas internas com mesmo nome, erro no codigo apresentado

No código abaixo apresentado em aula para a resolução do problema de converter imagens quando temos multiplas pastas

varrer_diretorio(){
    cd $1
    for arquivo in *
    do
        local caminho_arquivo=$(find ~Downloads/imagens-novos-livros -name $arquivo)
        if [ -d $caminho_arquivo ]
        then
            varrer_diretorio $caminho_arquivo
        else
            converte_imagem $caminho_arquivo
        fi
    done
}

Acredito que tenha um problema que no exemplo dado pelo autor não foi coberto, caso tenhamos pastas com o mesmo nome em niveis diferentes, por exemplo:

~Downloads/imagens-novos-livros/Backend
~Downloads/imagens-novos-livros/Java/Backend

Nesse caso a linha

local caminho_arquivo=$(find ~Downloads/imagens-novos-livros -name $arquivo)

quando a variavel arquivo for igual a Backend retornará multiplos valores o que gera um erro de execução

5 respostas

Oi André, acredito que não tenha problema ai, por que a recursão vai tratar cada pasta por vez. Então o backend externo será visto diferente do backend dentro do java.

Fala Wanderson !

Acredito que não seja assim, pense na primeira chamada, quando executamos

find ~Downloads/imagens-novos-livros -name $arquivo

como temos mais de uma pasta com mesmo nome dentro de imagens-novos-livros, o find retorna uma lista com todos os caminhos encontrados, por exemplo no nosso caso ele iria retornar :

~Downloads/imagens-novos-livros/Backend
~Downloads/imagens-novos-livros/Java/Backend

Ao atribuir isso para uma variavel ele separa os caminhos por espaço, logo nossa variavel caminho_arquivo teria seu valor igual a :

~Downloads/imagens-novos-livros/Backend ~Downloads/imagens-novos-livros/Java/Backend

E na proxima linha onde verificamos se isso é um diretorio é retornado um erro por conta da variável caminho_arquivo

Hm, acho que ficou mais claro agora. Porém, você disse que é retornado um erro, que erro é esse? Pode colocar a mensagem aqui?

O erro não é muito claro mas é o seguinte :

[: ./Backend: binary operator expected

ele indica o numero da linha que ocorre o erro e nela temos o comando :

if [ -d $caminho_arquivo ]

que é dado pela explicação do meu comentario acima

Isso é o que é confuso, como estamos fazendo uma recursão, eu consideraria que a função tem escopo próprio, então não deveria conflitar nomes iguais em escopos diferentes na memória.

É a questão da stack de processamento. Será que o ShellScript não tem esse conceito implementado e ele compartilha o estado entre as chamadas de função? :/