Que comando pode ser usado para verificar se um diretório existe ou não, dentro de um script da shell?
Para verificar se existe um diretório em um script shell você pode usar o seguinte:
if [ -d "$DIRECTORY" ]; then
# Control will enter here if $DIRECTORY exists.
fi
Ou para verificar se um diretório não't existe:
if [ ! -d "$DIRECTORY" ]; then
# Control will enter here if $DIRECTORY doesn't exist.
fi
Contudo, como Jon Ericson assinala que os comandos subsequentes podem não funcionar como pretendido se não tiver em conta que um link simbólico para um directório também passará esta verificação. Por exemplo, executando isto:
ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then
rmdir "$SYMLINK"
fi
Irá produzir a mensagem de erro:
rmdir: failed to remove `symlink': Not a directory
Portanto, links simbólicos podem ter que ser tratados de forma diferente, se comandos subseqüentes esperam diretórios:
if [ -d "$LINK_OR_DIR" ]; then
if [ -L "$LINK_OR_DIR" ]; then
# It is a symlink!
# Symbolic link specific commands go here.
rm "$LINK_OR_DIR"
else
# It's a directory!
# Directory command goes here.
rmdir "$LINK_OR_DIR"
fi
fi
Tome especial atenção às aspas duplas usadas para embrulhar as variáveis, a razão disso é explicada por 8jean noutra resposta.
Se as variáveis contiverem espaços ou outros caracteres incomuns, provavelmente fará com que o script falhe.
Note que o teste **-d*** pode produzir alguns resultados surpreendentes:
$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory
File under: "When is a directory not a directory?" The answer: "When it's a symlink to a directory." Um teste um pouco mais completo:
if [ -d t ]; then
if [ -L t ]; then
rm t
else
rmdir t
fi
fi
Você pode encontrar mais informações no manual do Bash em Bash conditional expressions e no [[
comando builtin](https://www.gnu.org/software/bash/manual/bash.html#index-_005b) e no [[[
comando composto](https://www.gnu.org/software/bash/manual/bash.html#index-_005b_005b).
Verifique a existência da pasta dentro dos subdiretórios:
found=`find -type d -name "myDirectory"`
if [ -n "$found"]
então
# A variável 'found' contém o caminho completo onde "myDirectory" é.
# Pode conter várias linhas se houver várias pastas chamadas "myDirectory".
fi
Verifique a existência de uma ou várias pastas com base em um padrão dentro do diretório atual:
found=`find -maxdepth 1 -type d -name "my*"``
if [ -n "$found"]
então
# A variável 'found' contém o caminho completo onde as pastas "my*" foram encontradas.
fi
Ambas as combinações. No exemplo seguinte, ele verifica a existência da pasta no diretório atual:
found=`find -maxdepth 1 -type d -name "myDirectory"``
if [ -n "$found"]
então
# A variável 'found' não está vazia => "myDirectory"` existe.
fi