Como verificar corretamente se o arquivo existe no Bash ou Shell (com exemplos)
Índice
Neste tutorial, abordarei os diferentes atributos que você pode usar em bash ou shell scripting para verificar arquivos e diretórios. Você pode usar expressões condicionais bash com ]
ou usar teste com para verificar se o arquivo existe.
Vamos use o operador bash if e else para todos os exemplos, então recomendo que você leia: Guia de uso do Bash if else para iniciantes
1. Bash / Shell: Verifique se o arquivo existe e é um arquivo normal
Esta seção mostra os exemplos para verificar se o arquivo regular existe no bash.
1.1: Método 1: Usando colchetes simples ou duplos
Usando colchetes duplos ]
#!/bin/bashFILE="/etc/passwd"if ];then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
Usando colchetes simples
#!/bin/bashFILE="/etc/passwd"if ;then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
1.2: Método 2: Usando o comando de teste
O comando test
é usado para verificar os tipos de arquivo e comparar valores.
#!/bin/bashFILE="/etc/passwd"if test -f $FILE; then echo "$FILE exists"else echo "$FILE missing"fi
1.3: Método 3: Linha única
Podemos usar colchetes simples ou duplos aqui neste exemplo. Eu recomendaria sempre usar colchetes duplos ao escrever um código de linha no shell, pois isso minimiza o risco de receber avisos no console quando ocorre a divisão de palavras.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists" || echo "$FILE missing"
A instrução após &&
será executada se SUCESSO. Se a primeira condição retornar FALSO, a instrução com ||
será executada.
Da mesma forma, use o comando de teste para verificar se o arquivo regular existe no bash ou shell script em uma única linha .
#!/bin/bashFILE="/etc/passwd"test -f $FILE && echo "$FILE exists" || echo "$FILE missing"
2. Bash / Shell: Verifique se o arquivo existe (está vazio ou não)
Para verificar se o arquivo existe e se estiver vazio ou se tiver algum conteúdo, usamos o atributo “-s
”
2.1: Método 1: Usando colchetes simples ou duplos
Verifique se o arquivo existe e está vazio ou vazio usando colchetes duplos ]
#!/bin/bashFILE="/etc/passwd"if ]; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
Verifique se o arquivo existe e está vazio ou não está vazio usando colchetes duplos
if ; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
2.2: Método 2: Usando o comando de teste
Usando o comando de teste, combinamos o -s
atributo para verificar se o arquivo existe e está vazio ou tem algum conteúdo:
2.3: Método 3: Linha única
Podemos usar colchetes duplos ou simples para esse liner, mas como eu disse antes, recomendo o uso de colchetes duplos.
#!/bin/bashFILE="/etc/passwd"test -s $FILE && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
Da mesma forma, com o comando de teste, podemos usar &&
e ||
operador para verificar o arquivo em um comando de linha única dentro de nosso script de shell.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
3. Bash / Shell: Verifique se o diretório existe
Espero que você saiba que no Linux tudo é um arquivo. Dessa forma, um diretório também é considerado um arquivo. Podemos usar o atributo “-d
” para verificar se existe um diretório na programação do shell.
3.1: Método 1: Usando colchetes duplos ou simples
Podemos usar o atributo -d
em ou colchetes duplos
]
para verificar se o diretório existir.
#!/bin/bashDIR="/var/log"if ]; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
Da mesma forma, usamos colchetes simples neste exemplo para verificar se o diretório está predefinido no shell script.
#!/bin/bashDIR="/var/log"if ; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.2: Método 2: Usando o comando de teste
Neste exemplo, usaremos o comando de teste para ter certeza se o diretório está presente ou não antes de realizarmos determinada tarefa.
#!/bin/bashDIR="/var/log"if test -d $DIR; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.3: Método 3: Linha única
Neste exemplo, usaremos colchetes simples e duplos em forma de linha única para verificar para o diretório. A instrução após o operador &&
será executada se a primeira condição for TRUE e se for FALSE, a instrução da ||
condição “será executada .
#!/bin/bashDIR="/var/log"] && echo "$DIR exists" || echo "$DIR doesn"t exist"
Eu recomendaria usar ]
em vez de para esses códigos de linha na programação do shell.
Da mesma forma com &&
e ||
, podemos usar o comando de teste para verificar se o diretório existe
#!/bin/bashDIR="/var/log"test -d $DIR && echo "$DIR exists" || echo "$DIR doesn"t exist"
4. Bash / Shell: Verifique se o diretório existe (vazio ou não vazio)
Não há atributos de shell como usei em todos os outros exemplos e cenários neste tutorial. Mas temos alguns hacks que podemos usar para verificar se o diretório está vazio ou não vazio.
4.1: Método 1: Listar o conteúdo do diretório e verificar
Neste exemplo, listaremos o conteúdo do diretório, suprimiremos a saída e, com base no código de saída, verificaremos se o diretório está vazio ou contém algum content
#!/bin/bashDIR="/tmp"if ls -1qA $DIR | grep -q . ; then echo "$DIR is not -empty"else echo "$DIR is empty"fi
Também podemos reverter isso colocando uma condição NOT (!
). Portanto, seria semelhante a:
#!/bin/bashDIR="/tmp"if ! ls -1qA $DIR | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
A saída seria a mesma em ambos os scripts de exemplo.
4.2: Método 2: Usando comando find
Podemos usar o comando find e então suprimir a saída para verificar se o diretório de destino tem algum conteúdo ou não.
#!/bin/bashDIR="/tmp"if find -- "$DIR" -prune -type d -empty | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
4.3: Método 3: Listar o conteúdo
Novamente como eu disse, uma vez que não há uma maneira fácil de verificar se um diretório está vazio ou não usando alguns atributos, iremos listar o conteúdo do diretório. Se você não obtiver nenhuma saída, o diretório está vazio ou então não está vazio
#!/bin/bashDIR="/tmp"if ] ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
5. Bash / Shell: Lista de atributos para o arquivo de teste
Da mesma forma, existem muitos outros atributos que você pode usar com scripts de shell para verificar diferentes tipos de arquivo, como links simbólicos, permissões de arquivo etc.
Atributos | O que faz? | |
---|---|---|
-a FILE |
Verdadeiro se FILE existe |
|
-b FILE |
Verdadeiro se FILE existe e é um arquivo especial de bloco. |
|
-c FILE |
Verdadeiro se FILE existe e é um arquivo especial de caractere. |
|
-d FILE |
Verdadeiro se FILE existe e é um diretório. |
|
Verdadeiro se FILE existir |
||
-f FILE |
Verdadeiro se FILE existe e é um arquivo normal |
|
-g FILE |
Verdadeiro se FILE existir e seu bit set-group-id estiver definido |
|
-h FILE |
Verdadeiro se FILE existe e é um link simbólico |
|
-k FILE |
Verdadeiro se FILE existe e seu bit “aderente” está definido |
|
-p FILE |
Verdadeiro se FILE existe e é um tubo nomeado (FIFO) |
|
-r FILE |
Verdadeiro se FILE existe e é legível |
|
-s FILE |
Verdadeiro se FILE existe e tem um tamanho maior que zero |
|
-u FILE |
Verdadeiro se FILE existir e seu bit set-user-id estiver definido |
|
-w FILE |
Verdadeiro se FILE existe e é gravável |
|
-x FILE |
Verdadeiro se FILE existe e é executável |
|
-G FILE |
Verdadeiro se FILE existe e pertence ao ID de grupo efetivo |
|
-L FILE |
Verdadeiro se FILE existe e é um link simbólico |
|
-N FILE |
Verdadeiro se FILE existe e foi modificado desde a última leitura |
|
-o FILE |
Verdadeiro se FILE existe e é propriedade do efetivo ID do usuário |
|
-S FILE |
Verdadeiro se FILE existir e é um soquete |
|
|
Verdadeiro se FILE1 e FILE2 referem-se ao mesmo dispositivo e números de inode |
|
FILE1 -nt FILE2 |
Verdadeiro se FILE1 for mais recente (de acordo com a data de modificação) do que FILE2 , ou se FILE1 existir e FILE2 existir não |
|
FILE1 -ot FILE2 |
Verdadeiro se FILE1 for mais antigo do que FILE2 ou se FILE2 existir e FILE1 não |