it-swarm-es.tech

Opción o comando para encontrar si un archivo está vacío

¿Hay algún comando que permita descubrir si un archivo contiene o no algo?

Intenté con la opción de tamaño ls '(ls -lsh) pero no me muestra los archivos vacíos porque los archivos/carpetas no tienen tamaño.

4
Ziadd Hosary

Podríamos analizar un archivo por tamaño usando el comando du.

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

Sin embargo, hay una pequeña trampa. ¿Qué queremos decir con el archivo vacío? Tenga en cuenta que hay archivos con caracteres no imprimibles. Aquí hay un ejemplo:

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

Mira ! ¿He hecho eco de un espacio vacío en el archivo y, sin embargo, informa algún tamaño en bytes? como puede ser ?! Bueno, todavía hemos escrito una nueva línea en el archivo.

Como se muestra en esta brillante respuesta , los archivos en los discos están en fragmentos de 4096 bytes. Cuando escribimos unos pocos bytes en el disco, el sistema operativo todavía asigna una porción de 4096 bytes. Entonces, técnicamente, el archivo aquí está vacío desde el punto de vista legible para los humanos y, sin embargo, contiene bytes.

Podemos crear referencias a un archivo, que será de 0 bytes, pero una vez que tratemos de llenarlo con cualquier dato, le daremos 4096 bytes.

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

¿Pero por qué el directorio tiene 4096 bytes ? Los directorios son una especie de listas. Una vez que crea un directorio, incluso uno vacío, contiene información (para aquellos interesados ​​en el lenguaje de programación C, esa es una estructura directa, que contiene un número de inodo, longitud de registro, tipo y nombre; búsqueda dirent.h). Entonces, aunque el directorio no tenga archivos, contendrá información sobre sí mismo.

4

Puede usar test con -f y ! -s, que devolverá 0 en caso de un archivo regular vacío existente o 1 de lo contrario:

-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'

O usando una sintaxis más común:

[ -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'
$ 

Puede agregar una función a ~/.bashrc por conveniencia:

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

O usando una sintaxis más común:

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 
$ 
10
kos

También puede usar stat:

$ touch file
$ stat --format '%F' file
regular empty file
$ echo 'a' > file
$ stat --format '%F' file
regular file
1
Nykakin

...o esto:

find /dir/to/file -maxdepth 1 -name file_name -empty
0
igoryonya