Como verificar se um arquivo existe em Linux Bash Scripts

0
39


fatmawati achmad zaenuri / Shutterstock.com

Se um script Linux Bash depende da presença de certos arquivos ou diretórios, você não pode simplesmente presumir que sim. Você precisa verificar se eles estão definitivamente presentes. É assim que se faz.

não suponha nada

Ao escrever um script, você não pode fazer suposições sobre o que está e o que não está presente em um computador. Isso é duplamente verdadeiro se o script for distribuído e executado em muitos computadores diferentes. Mais cedo ou mais tarde, o script será executado em um computador que não atende às suas suposições e falhará ou será executado de forma imprevisível.

Tudo o que valorizamos ou criamos em um computador é armazenado em um arquivo de algum formato, e todos esses arquivos residem em um diretório. Os scripts podem ler, escrever, renomear, excluir e mover arquivos e diretórios, tudo o que você pode fazer na linha de comando.

A vantagem que você tem como ser humano é que você pode ver o conteúdo de um diretório e saber se um arquivo existe ou não, ou mesmo se o diretório esperado existe. Se um script falhar ao manipular arquivos, pode ter resultados sérios e prejudiciais.

O Bash fornece um conjunto abrangente de testes que você pode usar para detectar arquivos e diretórios e testar muitos de seus atributos. É fácil criá-los, mas os benefícios em termos de robustez e controle refinado são consideráveis.

RELACIONADO: Como usar testes condicionais de colchetes duplos no Linux

A gama de testes

Ao combinar a instrução if com o teste apropriado de uma grande coleção de testes de arquivos e diretórios, podemos determinar facilmente se um arquivo existe, é executável ou gravável e muito mais.

  • -b: Retorna verdadeiro se o arquivo for um arquivo especial de bloco.
  • -C: Retorna verdadeiro se o arquivo for um caractere especial.
  • -d: Retorna verdadeiro se “arquivo” for um diretório.
  • -Y: Retorna verdadeiro se o arquivo existir.
  • -F: Retorna verdadeiro se o arquivo existir e for um arquivo normal.
  • -grama: Retorna verdadeiro se o arquivo tiver a setgid conjunto de permissões (chmod g+).
  • -h: Retorna verdadeiro se o arquivo for um link simbólico.
  • -EU: Retorna verdadeiro se o arquivo for um link simbólico.
  • -k: Retorna true se tiver seu sticky bit definido (chmod +t).
  • -p: Retorna true se o arquivo for um pipe nomeado.
  • -r: Retorna verdadeiro se o arquivo for legível.
  • -s: Retorna true se os arquivos existirem S Não está vazio.
  • -S: Retorna verdadeiro se o arquivo for um soquete.
  • -t: Retorna verdadeiro se o descritor de arquivo for aberto em um terminal.
  • -sua: Retorna verdadeiro se o arquivo tiver a setuid conjunto de permissões (chmod u+).
  • -W: Retorna verdadeiro se o arquivo pode ser gravado.
  • -X: Retorna verdadeiro se o arquivo for executável.
  • -QUALQUER: Retorna verdadeiro se for de sua propriedade.
  • -GRAMA: Retorna verdadeiro se pertencer ao seu grupo.
  • -NORTE: Retorna verdadeiro se o arquivo foi modificado desde a última vez que foi lido.
  • !: O operador lógico NOT.
  • &&: O operador lógico AND.
  • ||: O operador lógico OR.

A lista começa com -b porque ele -a O teste foi descontinuado e substituído pelo -e Teste.

RELACIONADO: Como usar SUID, SGID e Sticky Bits no Linux

Usando testes em scripts

O teste de arquivo genérico if instrução é uma construção de script simples. A comparação dentro dos colchetes duplos” [[ ]] “Use o -f teste para determinar se existe um arquivo regular com esse nome.

Copie o texto deste script em um editor e salve-o em um arquivo chamado “script1.sh”, e use chmod para torná-lo executável.

#!/bin/bash

if [[ -f $1 ]] 

then 

  echo "The file $1 exists." 

else 

  echo "The file $1 cannot be found." 

fi

Você precisa passar o nome do arquivo para o script na linha de comando.

chmod +x script1.sh

Fazendo um script executável com chmod

Você precisará fazer isso com cada script se quiser experimentar os outros exemplos do artigo.

Vamos testar o script em um arquivo de texto simples.

./script1.sh test-file.txt

Executando script1.sh em um arquivo normal

O arquivo existe e o script relata corretamente esse fato. Se excluirmos o arquivo e tentarmos novamente, o teste falhará e o script o reportará.

./script1.sh test-file.txt

Executando script1.sh em um arquivo que não existe

Em uma situação da vida real, seu script precisaria tomar qualquer ação apropriada. Talvez marque o erro e pare. Talvez crie o arquivo e continue. Você pode copiar algo de um diretório de backup para substituir o arquivo ausente. Tudo depende do objetivo do roteiro. Mas pelo menos agora o script pode tomar a decisão com base na presença ou não do arquivo.

a -f flag verifica se o arquivo está presente e se é um arquivo “regular”. Em outras palavras, não é algo que parece ser um arquivo, mas não é, como um arquivo de dispositivo.

Usaremos ls para verificar se o arquivo “/dev/random” existe, e então veremos o que o script faz com ele.

ls -lh /dev/random
./script /dev/random

Execute script1.sh em um arquivo de dispositivo

Como nosso script está testando arquivos normais e “/dev/random” é um arquivo de dispositivo, o teste falha. Muitas vezes, para saber se um arquivo existe, você precisa escolher cuidadosamente qual teste usar ou usar vários testes.

Este é o “script2.sh”, que procura por arquivos normais e arquivos de dispositivos de caracteres.

#!/bin/bash

if [[ -f $1 ]]
then
  echo "The file $1 exists."
else
  echo "The file $1 is missing or not a regular file."
fi

if [[ -c $1 ]]
then
  echo "The file $1 is a character device file."
else
  echo "The file $1 is missing or not a special file." 
fi

Se executarmos esse script no arquivo de dispositivo “/dev/random”, o primeiro teste falhará, o que esperávamos, e o segundo teste será bem-sucedido. Ele reconhece o arquivo como um arquivo de dispositivo.

./script2.sh /dev/random

Execute script2.sh em um arquivo de dispositivo de caractere

Na verdade, ele o reconhece como um personagem arquivo do dispositivo. Alguns arquivos de dispositivo são arquivos de dispositivo de bloco. Do jeito que está, nosso script não vai dar conta.

./script2.sh /dev/sda

Executando script2.sh em um arquivo de dispositivo de bloco

Podemos fazer uso da lógica. OR operador e inclua outro teste na segunda instrução if. Desta vez, se o arquivo for um arquivo de dispositivo de caractere qualquer um arquivo de dispositivo de bloco, o teste retornará true. Este é “script3.sh”.

#!/bin/bash

if [[ -f $1 ]]
then
  echo "The file $1 exists."
else
  echo "The file $1 is missing or not a regular file."
fi

if [[ -c $1 || -b $1 ]]
then
  echo "The file $1 is a character or block device file."
else
  echo "The file $1 is missing or not a special file." 
fi

Este script reconhece arquivos de dispositivo de caracteres e arquivos de dispositivo de bloco.

./script3.sh /dev/random
./script3.sh /dev/sda

script3.sh lida corretamente com arquivos de dispositivo de caracteres e blocos

Se for importante para você diferenciar os diferentes tipos de arquivos do dispositivo, você pode usar if declarações. Este é “script4.sh”.

#!/bin/bash

if [[ -f $1 ]]
then
  echo "The file $1 exists."
else
  echo "The file $1 is missing or not a regular file."
fi

if [[ -c $1 ]]
then
  echo "The file $1 is a character device file."
else
  if [[ -b $1 ]]
  then
    echo "The file $1 is a block device file." 
  else
    echo "The file $1 is missing or not a device file."
  fi
fi

Este script reconhece e categoriza arquivos de dispositivo de caractere e arquivos de dispositivo de bloco.

./script4.sh /dev/random
./script4.sh /dev/sda

script8.sh identificando corretamente os arquivos de caracteres e dispositivos de bloco

Usando o operador lógico AND, podemos testar vários recursos de uma só vez. Este é “script5.sh”. Verifique se existe um arquivo S o script leu S permissões de gravação para ele.

#!/bin/bash

if [[ -f $1 && -r $1 && -w $1 ]]
then
  echo "The file $1 exists and we have read/write permissions."
else
  echo "The file $1 is missing, not a regular file, or we can't read/write to it."
fi

Executaremos o script em um arquivo que pertence a nós e um que pertence a root.

./script5.sh .bashrc
./script5.sh /etc/fstab

script5.sh verificando se existe um arquivo e se as permissões de leitura e gravação estão definidas

Para verificar a existência de um diretório, use o -d Teste. Este é “script6.sh”. Faz parte de um script de backup. A primeira coisa que faz é verificar se o diretório passado na linha de comando existe ou não. usar lógica NOT operador ! no if prova de declarações

#!/bin/bash

if [[ ! -d $1 ]]
then
  echo "Creating backup directory:" $1
  mkdir $1

  if [[ ! $? -eq 0 ]]
  then
    echo "Couldn't create backup directory:" $1
    exit
  fi
else
  echo "Backup directory exists."
fi

# continue with file backup
echo "Backing up to: "$1

Se o diretório não existir, crie-o. Se os arquivos de compilação do diretório, o script for encerrado. Se a criação do diretório for bem-sucedida ou se o diretório já existir, o script continuará com suas ações de backup.

Vamos executar o script e depois verificá-lo com ls e ele -d (diretório) se o diretório de backup existir.

./script6.sh Documents/project-backup
ls -d Documents/project-backup

script6.sh detectando se existe um diretório

O diretório de backup foi criado. Se executarmos o script novamente, ele deverá informar que o diretório já está presente.

./script6.sh

script6.sh reutilizando um diretório existente

O script encontra o diretório e continua a fazer o backup.

Tente, não assuma

Mais cedo ou mais tarde, suposições levarão a coisas ruins acontecendo. Tente primeiro e reaja de acordo.

Conhecimento é poder. Use testes para dar aos seus scripts o conhecimento de que eles precisam.

RELACIONADO: Como permitir que scripts do Linux detectem que estão sendo executados em máquinas virtuais