Opção ou comando para descobrir se um arquivo está vazio

4

Existe um comando que permite descobrir se um arquivo contém alguma coisa ou não?

Eu tentei com a opção ls 'size ( ls -lsh ), mas ela não mostra os arquivos vazios porque os arquivos / pastas não têm tamanho.

    
por Ziadd Hosary 15.03.2016 / 00:13

4 respostas

4

Poderíamos analisar um arquivo pelo tamanho usando o comando du .

$> du Desktop/datasheet-3347.pdf                                
3564    Desktop/datasheet-3347.pdf

No entanto, há uma pequena captura. O que queremos dizer com o arquivo vazio? Esteja ciente de que existem arquivos com caracteres não imprimíveis. Aqui está um exemplo:

$> touch myFile.txt                                                            
$> echo '' > myFile.txt
$> du myFile.txt
4   myFile.txt

Olha! Eu ecoei o espaço vazio no arquivo e, ainda assim, ele informa algum tamanho em bytes? como pode ser ?! Bem, ainda escrevemos uma única nova linha no arquivo.

Como mostrado em esta brilhante resposta , os arquivos em discos estão em partes de 4096 bytes. Quando escrevemos apenas alguns bytes no disco, o sistema operacional ainda aloca um pedaço de 4096 bytes. Então, tecnicamente, o arquivo aqui está vazio do ponto de vista legível e, ainda assim, contém bytes.

Podemos criar uma referência a um arquivo, que será de 0 bytes, mas, assim que tentarmos preenchê-lo com qualquer dado, daremos a ele 4096 bytes

$> touch myFile2.txt                                                           
$> du myFile2.txt
0   myFile2.txt

Mas por que o diretório é 4096 bytes ? diretórios são tipos de listas. Depois de criar um diretório, mesmo vazio, ele contém informações (para os interessados em linguagem de programação C, que é a estrutura dirent, que contém o número do inode, o tamanho do registro, o tipo e o nome; lookup dirh.h). Portanto, mesmo que o diretório não tenha arquivos, ele conterá informações sobre si mesmo.

    
por Sergiy Kolodyazhnyy 15.03.2016 / 00:39
10

Você pode usar test com -f e ! -s , que retornará 0 no caso de um arquivo regular vazio existente ou 1 caso contrário:

-f FILE
    FILE exists and is a regular file
-s FILE
    FILE exists and has a size greater than zero
test -f file -a ! -s file && printf 'File exists and is empty.\n'

Ou usando uma sintaxe mais comum:

[ -f file -a ! -s file ] && printf 'File exists and is empty.\n'
$ touch empty
$ printf '\n' >non_empty
$ test -f file -a ! -s empty && printf 'File exists and is empty.\n'
File exists and is empty.
$ test -f file -a ! -s non_empty && printf 'File exists and is empty.\n'
$ 

Você pode adicionar uma função a ~/.bashrc por conveniência:

is_empty() { test -f file -a ! -s file && printf 'File exists and is empty.\n'; }

Ou usando uma sintaxe mais comum:

is_empty() { [ -f file -a ! -s file ] && printf 'File exists and is empty.\n'; }
$ touch empty
$ printf '\n' >non_empty
$ is_empty empty 
File exists and is empty.
$ is_empty non_empty 
$ 
    
por kos 15.03.2016 / 02:01
1

Você também pode usar stat :

$ touch file
$ stat --format '%F' file
regular empty file
$ echo 'a' > file
$ stat --format '%F' file
regular file
    
por Nykakin 15.03.2016 / 15:58
0

... ou isto:

find /dir/to/file -maxdepth 1 -name file_name -empty
    
por igoryonya 19.03.2016 / 07:04