¿Cómo verificar si un archivo está vacío en Bash?

184

Tengo un archivo llamado diff.txt. Quiere verificar si está vacío. Hice algo como esto pero no pude hacerlo funcionar.

if [ -s diff.txt ]
then
        touch empty.txt
        rm full.txt
else
        touch full.txt
        rm emtpy.txt
fi
Mich
fuente
24
[-s FILE] Verdadero si FILE existe y tiene un tamaño mayor que cero. Por lo tanto, obtiene "empty.txt" si "diff.txt" no está vacío.
Matthias
2
PD: si desea verificar una diffllamada real , simplemente verifique el valor de retorno:if diff foo.txt bar.txt; then echo 'No difference'
l0b0
20
La prueba se puede negar:if [ ! -s diff.txt ]; then echo "IS EMPTY";else echo "HAS SOMETHING";fi
David Ramirez
Tenga cuidado con los caracteres de la nueva línea. Mira el archivo con$ cat diff.txt | hexdump -C
Alejandro Blasco

Respuestas:

225

Los errores ortográficos son irritantes, ¿no? Revisa tu ortografía empty, pero luego prueba esto:

#!/bin/bash -e

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

Me gustan mucho los scripts de shell, pero una desventaja es que el shell no puede ayudarte cuando escribes mal, mientras que un compilador como tu compilador de C ++ puede ayudarte.

Observe, por cierto, que he cambiado los roles de empty.txty full.txt, como sugiere @Matthias.

thb
fuente
66
El caparazón puede ayudar con errores ortográficos. 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
El uso de la herramienta shellcheck puede encontrar errores ortográficos muy bien.
Yokai
1
¿Seguramente esto fallará si el archivo tampoco existe? Se supone que esto es una comprobación si el archivo está vacío solamente.
geedoubleya
@geedoubleya: Claro. Ese es un punto razonable. Si la existencia del archivo fuera relevante (como, por supuesto, podría serlo), entonces uno podría ajustar el script en consecuencia. Si respondiera el guión ajustado como respuesta y me pellizcara, votaría.
thb
1
También puedesset -u
Jon McClung el
71
[ -s file.name ] || echo "file is empty"
blanco mickey
fuente
8
[[-s file.name]] && echo "full" || echo "vacío"
McPeppr
1
[[ -s file.name ]] || { [[ -f file.name ]] && echo 'empty' || echo 'does not exist'; }
smarber
53

[[-s archivo]] -> Comprueba si el archivo tiene un tamaño mayor que 0

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

Si es necesario, esto verifica todos los archivos * .txt en el directorio actual; e informa todo el archivo vacío:

for file in *.txt; do if [[ ! -s $file ]]; then echo $file; fi; done
Surya
fuente
3
No es necesario que lo haga $(ls *.txt, y de hecho no debería. Algunas personas tienen valores predeterminados establecidos para lsusar el formato largo (como yo) y el shell ya se expandirá *.txtpor sí solo. Solo hazlo en su for file in *.txtlugar.
Lilith
¡Agradable! Si desea verificar todos los archivos txt de forma recursiva, puede usarlo findasí:for file in $(find . -name '*.txt'); do if [[ ! -s $file ]]; then echo $file; fi; done
KlimczakM
1
Votado a favor solo por este horrible antipatrón for file in $(ls *.txt); do. Por favor, use for file in *.txt; doen su lugar; por favor lea esta página de Bash Pitfalls ; y por favor deja de difundir antipatrones como este.
gniourf_gniourf
8

Si bien las otras respuestas son correctas, el uso de la "-s"opción también mostrará que el archivo está vacío, incluso si el archivo no existe.
Al agregar esta verificación adicional "-f"para ver si el archivo existe primero, nos aseguramos de que el resultado sea correcto.

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
fuente
4

La respuesta de @geedoubleya es mi favorita.

Sin embargo, prefiero esto

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
smarber
fuente
3

Para verificar si el archivo está vacío o solo tiene espacios en blanco , puede usar grep:

if [[ -z $(grep '[^[:space:]]' $filename) ]] ; then
  echo "Empty file" 
  ...
fi
Noam Manos
fuente
Esta es la única buena respuesta y debería ser la aceptada. Usar -sno responde la pregunta. Busca un archivo que existe y tiene un tamaño de más de 0 bytes.
Akito
2

Muchas de las respuestas son correctas, pero creo que podrían ser más completas / simplistas, etc., por ejemplo:

Ejemplo 1: instrucción 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

si $ read_file está vacío o no, detiene el show con exit. Más de una vez he leído mal la respuesta principal aquí para significar lo contrario.

Ejemplo 2: como una función

# -- 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
fuente
1
[[ -f filename && ! -s filename ]] && echo "filename exists and is empty"
Radek 'Goblin' Pieczonka
fuente
0

Vine aquí buscando cómo eliminar __init__.pyarchivos vacíos , ya que están implícitos en Python 3.3+ y terminé usando:

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

También (al menos en zsh) usando $ path como la variable también rompe su env $ PATH y, por lo tanto, romperá su shell abierto. De todos modos, pensé en compartir!

SamMorrowDrums
fuente
0

La forma más fácil de verificar que el archivo esté vacío o no:

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

También puedes escribirlo en una sola línea:

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