and show no contents when cat-ing the file.
Nenhuma saída de cat para um arquivo não implica que o arquivo esteja vazio, como mostra a seguinte experiência:
$ truncate -s 1M foo
$ ll foo
-rw-r----- 1 user users 1048576 Nov 15 19:28 foo
$ file foo
foo: data
$ cat foo
$
cat produz 1MiB de caracteres NUL, mas esses caracteres são invisíveis em um terminal.
Sua pergunta sobre arquivos vazios é um tanto ambígua. O foo acima se qualifica? Se "vazio" significa comprimento zero, então find pode ajudar você:
find dir -type f -empty
lista todos os arquivos com comprimento zero em dir . Se o seu find não suportar -empty , você poderá usar -size 0 .
Em scripts de shell, você pode usar a expressão -s file , que é verdadeira se file existir e não estiver vazia. A fim verificar se um arquivo está vazio (dado que existe) use algo como
if [ \! -s file ] ; then ... ; fi
Como alternativa, você pode usar stat(1) . Aqui com a variante GNU:
$ stat --format=%s foo
1048576
que você pode usar mais em comparações.