Como verificar se um arquivo está vazio no Bash?

183

Eu tenho um arquivo chamado diff.txt. Deseja verificar se está vazio. Fiz algo assim, mas não consegui fazê-lo funcionar.

if [ -s diff.txt ]
then
        touch empty.txt
        rm full.txt
else
        touch full.txt
        rm emtpy.txt
fi
Mich
fonte
24
[-s FILE] Verdadeiro se FILE existir e tiver um tamanho maior que zero. Assim, você obtém "empty.txt" se "diff.txt" não estiver vazio.
Matthias
2
PS: Se você quiser verificar uma real diffchamada, basta verificar o valor de retorno:if diff foo.txt bar.txt; then echo 'No difference'
l0b0
20
O teste pode ser negado:if [ ! -s diff.txt ]; then echo "IS EMPTY";else echo "HAS SOMETHING";fi
David Ramirez
Cuidado com os caracteres de nova linha à direita. Confira o arquivo com$ cat diff.txt | hexdump -C
Alejandro Blasco

Respostas:

225

Erros de ortografia são irritantes, não são? Verifique sua ortografia empty, mas tente também:

#!/bin/bash -e

if [ -s diff.txt ]
then
        rm -f empty.txt
        touch full.txt
else
        rm -f full.txt
        touch empty.txt
fi

Eu gosto muito de scripts de shell, mas uma desvantagem disso é que o shell não pode ajudá-lo quando você escreve incorretamente, enquanto um compilador como o seu compilador C ++ pode ajudá-lo.

Observe, aliás, que troquei os papéis de empty.txte full.txt, como @Matthias sugere.

thb
fonte
6
O shell pode ajudar com erros de ortografia. empty=empty.txt; full=full.txt; diff=diff.txt; if [ -s ${diff?} ]; then r=${empty?} t=${full?}; else r=${full?} t=${empty?}; fi; rm ${r?}; touch ${t?}
William Pursell
1
O uso da verificação de ferramenta pode encontrar erros de ortografia.
Yokai
1
Certamente isso falhará se o arquivo também não existir? Supõe-se que seja uma verificação se o arquivo está vazio apenas.
geedoubleya
@geedoubleya: Claro. Esse é um ponto razoável. Se a existência do arquivo for relevante (como, é claro, pode ser), é possível ajustar o script de acordo. Se você desse o script ajustado como resposta e me enviasse um ping, eu votaria.
THB
1
Você também podeset -u
Jon McClung
71
[ -s file.name ] || echo "file is empty"
mickey branco
fonte
8
[[-s file.name]] && echo "full" || eco "vazio"
McPeppr 29/01
1
[[ -s file.name ]] || { [[ -f file.name ]] && echo 'empty' || echo 'does not exist'; }
Smarber 11/04/19
53

[[-s file]] -> Verifica se o arquivo tem tamanho maior que 0

if [[ -s diff.txt ]]; then echo "file has something"; else echo "file is empty"; fi

Se necessário, isso verifica todos os arquivos * .txt no diretório atual; e relata todo o arquivo vazio:

for file in *.txt; do if [[ ! -s $file ]]; then echo $file; fi; done
Surya
fonte
3
Você não precisa fazer $(ls *.txt, e de fato não deveria. Algumas pessoas têm padrões definidos para lsusar o formato longo (como eu) e o shell já será expandido *.txtpor conta própria. Apenas faça for file in *.txt.
Lilith
Agradável! Se você deseja verificar todos os arquivos txt de forma recursiva, pode usar o findseguinte:for file in $(find . -name '*.txt'); do if [[ ! -s $file ]]; then echo $file; fi; done
KlimczakM 8/08/18
1
Votado apenas por causa deste horrível anti-padrão for file in $(ls *.txt); do. Por favor use em seu for file in *.txt; dolugar; por favor leia esta página Bash Pitfalls ; e por favor, pare de espalhar antipadrões assim.
gniourf_gniourf 23/01/19
8

Enquanto as outras respostas estiverem corretas, o uso da "-s"opção também mostrará que o arquivo está vazio, mesmo que ele não exista.
Ao adicionar essa verificação adicional "-f"para verificar se o arquivo existe primeiro, garantimos que o resultado esteja correto.

if [ -f diff.txt ]
then
  if [ -s diff.txt ]
  then
    rm -f empty.txt
    touch full.txt
  else
    rm -f full.txt
    touch empty.txt
  fi
else
  echo "File diff.txt does not exist"
fi
geedoubleya
fonte
4

Resposta @geedoubleya é o meu favorito.

No entanto, eu prefiro isso

if [[ -f diff.txt && -s diff.txt ]]
then
  rm -f empty.txt
  touch full.txt
elif [[ -f diff.txt && ! -s diff.txt ]]
then
  rm -f full.txt
  touch empty.txt
else
  echo "File diff.txt does not exist"
fi
mais esperto
fonte
3

Para verificar se o arquivo está vazio ou possui apenas espaços em branco , você pode usar o grep:

if [[ -z $(grep '[^[:space:]]' $filename) ]] ; then
  echo "Empty file" 
  ...
fi
Noam Manos
fonte
Esta é a única boa resposta e deve ser a aceita. O uso -snão responde à pergunta. Ele procura por um arquivo que exista e tenha um tamanho superior a 0 bytes.
Akito
2

Muitas das respostas estão corretas, mas eu sinto que elas podem ser mais completas / simplistas, etc., por exemplo:

Exemplo 1: Instrução if básica

# BASH4+ example on Linux :

typeset read_file="/tmp/some-file.txt"
if [ ! -s "${read_file}" ]  || [ ! -f "${read_file}" ] ;then
    echo "Error: file (${read_file}) not found.. "
    exit 7
fi

se $ read_file estiver vazio ou não parar o show com exit. Mais de uma vez, eu interpretei mal a resposta principal aqui para dizer o contrário.

Exemplo 2: Como uma Função

# -- Check if file is missing /or empty --
# Globals: None
# Arguments: file name
# Returns: Bool
# --
is_file_empty_or_missing() {
    [[ ! -f "${1}" || ! -s "${1}" ]] && return 0 || return 1
}
Mike Q
fonte
1
[[ -f filename && ! -s filename ]] && echo "filename exists and is empty"
Radek 'Goblin' Pieczonka
fonte
0

Eu vim aqui procurando como excluir __init__.pyarquivos vazios, pois eles estão implícitos no Python 3.3+ e acabaram usando:

find -depth '(' -type f  -name __init__.py ')' -print0 |
  while IFS= read -d '' -r file; do if [[ ! -s $file ]]; then rm $file; fi; done

Além disso (pelo menos no zsh), o uso de $ path como variável também quebra seu env $ PATH e, portanto, quebra seu shell aberto. Enfim, pensei em compartilhar!

SamMorrowDrums
fonte
0

A maneira mais fácil de verificar o arquivo está vazia ou não:

if [ -s /path-to-file/filename.txt ]
then
     echo "File is not empty"
else
     echo "File is empty"
fi

Você também pode escrevê-lo em uma única linha:

[ -s /path-to-file/filename.txt ] && echo "File is not empty" || echo "File is empty"
Nabeel Shaikh
fonte