2012-04-01 122 views
88

Tengo un archivo llamado diff.txt. Quiere comprobar si está vacío. Hizo algo como esto pero no pudo hacerlo funcionar.¿Cómo comprobar si un archivo está vacío en Bash?

if [ -s diff.txt ] 
then 
     touch empty.txt 
     rm full.txt 
else 
     touch full.txt 
     rm emtpy.txt 
fi 
+12

[-s FILE] Verdadero si ARCHIVO existe y tiene un tamaño mayor que cero. Por lo tanto, obtienes "empty.txt" si "diff.txt" no está vacío. – Matthias

+2

PD: Si desea verificar una llamada 'diff' real, simplemente verifique el valor de retorno:' if diff foo.txt bar.txt; luego echo 'No difference'' – l0b0

+11

La prueba puede ser negada: 'if [! -s diff.txt]; luego echo "ESTÁ VACÍO"; sino echo "TIENE ALGO"; fi' –

Respuesta

124

Las faltas de ortografía son irritantes, ¿verdad? Comprobar la ortografía de empty, pero también intente 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 gusta shell scripting mucho, pero una desventaja de esto es que la cáscara no puede ayudarle cuando se escribe mal, mientras que un compilador como el compilador de C++ puede ayudarte.

Fíjate que he cambiado los roles de empty.txt y full.txt, como @Matthias sugiere.

+2

El caparazón puede ayudar con errores ortográficos. 'empty = empty.txt; full = full.txt; diff = diff.txt; si [-s $ {diff?}]; entonces r = $ {vacio?} t = $ {completo?}; else r = $ {full?} t = $ {empty?}; fi; rm $ {r?}; toque $ {t?} ' –

+0

Usando la herramienta shellcheck puede encontrar errores de ortografía muy bien. – Yokai

+1

Seguramente esto fallará si el archivo no existe tampoco? Se supone que esto es un control si el archivo está vacío solamente. – geedoubleya

40
[ -s file.name ] || echo "file is empty" 
+2

[[-s file.name]] && echo "full" || echo "vacío" – McPeppr

11

[[-s presentar]] -> 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 comprueba todos los archivos .txt * en el directorio actual; e informa de todo el archivo vacío:

for file in $(ls *.txt); do if [[ ! -s $file ]]; then echo $file; fi; done 
1

Mientras que las otras respuestas son correctas, utilizando la opción "-s" también mostrará el archivo está vacío, incluso si no existe el archivo.
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 
Cuestiones relacionadas