Quero verificar a existência de vários diretórios, dizem, dir1
, dir2
e dir3
, no diretório de trabalho.
Eu tenho o seguinte
if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
echo True
else
echo False
fi
Mas suspeito que exista uma maneira mais elegante de fazer isso. Não assuma que exista um padrão nos nomes dos diretórios.
O objetivo é verificar a existência de alguns diretórios e a inexistência de outros.
Estou usando o Bash, mas o código portátil é o preferido.
shell-script
shell
files
directory
control-flow
Elegância
fonte
fonte
$PWD
, a propósito.[ -d "$PWD/dir1"]
é equivalente a[ -d "dir1" ]
.Respostas:
Se você já espera que sejam diretórios e está apenas verificando se todos eles existem, você pode usar o código de saída do
ls
utilitário para determinar se um ou mais "erros ocorreram" :Eu redireciono a saída e stderr para
/dev/null
, a fim de fazê-la desaparecer, já que nos preocupamos apenas com o código de saídals
, não com a saída. Tudo o que foi escrito para/dev/null
desaparecer - não é gravado no seu terminal.fonte
1
é stdout,2
é stderr e sei o que é redirecionar. Não entendo o significado de/dev/null
e não sei como analisar o comando.&>filename
redireciona stdout e stderr parafilename
. Portanto, o comando não poderia ser simplificado (pelo menos para mim é mais simples) comols "$PWD/dir1" "$PWD/dir2" "$PWD/dir2" &>/dev/null && echo All there
?-d
opção (a), portantols
, apenas precisa declarar os diretórios, e não lê-los; e (b) para que o comando seja bem-sucedido, mesmo que o usuário não tenha acesso de leitura aos diretórios. (2) Não vejo nenhuma razão para usá-lo,"$PWD/"
exceto para me proteger contra diretórios cujos nomes começam com-
(e, é claro, existem maneiras melhores de fazer isso).Gostaria de loop:
Isso
break
causa um curto-circuito no loop, assim como sua cadeia de&&
fonte
Um loop pode ser mais elegante:
Este é o Bash. Um mais portátil é o Sh. Lá você pode usar a matriz posicional:
Então, para fazer um loop, use
"$@"
.fonte
Por que não apenas:
fonte
But I suspect there is a more elegant way of doing this
-a
: "-a
e-o
operadores binários de primárias (...) foram marcados como obsoletos": pubs.opengroup.org/onlinepubs/9699919799test
(aka[
) três vezes isso invoca uma vez,Conforme a pergunta, duas funções portáteis de shell que testam a existência e a inexistência de vários diretórios:
Exemplo:
fonte
Com base na resposta de glenn jackman , podemos testar a inexistência de outros nomes como este:
Eu costumava[ -e "$dir" ]
testar se"$dir"
existe; ou seja, sedir5
existe, mas é um arquivo, o resultado éFalse
. Se você quiser apenas testar se os nomes no segundo grupo são diretórios, use[ -d "$dir" ]
, como no primeiro loop.Como estamos falando de verificar a existência de coisas no diretório de trabalho atual, provavelmente não é necessário especificar
$PWD/
os nomes; apenas façafonte