Come verificare se un file è vuoto in Bash?


183

Ho un file chiamato diff.txt. Vuoi verificare se è vuoto. Ha fatto qualcosa del genere ma non è riuscito a farlo funzionare.

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

24
[-s FILE] Vero se FILE esiste e ha una dimensione maggiore di zero. Quindi, ottieni "empty.txt" se "diff.txt" non è vuoto.
Matthias,

2
PS: Se vuoi controllare una diffchiamata reale , controlla il valore di ritorno:if diff foo.txt bar.txt; then echo 'No difference'
l0b0

20
Il test può essere negato:if [ ! -s diff.txt ]; then echo "IS EMPTY";else echo "HAS SOMETHING";fi
David Ramirez,

Fai attenzione ai caratteri di nuova riga finali. Controlla il file con$ cat diff.txt | hexdump -C
Alejandro Blasco il

Risposte:


225

Gli errori di ortografia sono irritanti, vero? Controlla l'ortografia di empty, ma poi prova anche questo:

#!/bin/bash -e

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

Mi piace molto lo scripting della shell, ma uno svantaggio è che la shell non può aiutarti quando si scrive male, mentre un compilatore come il compilatore C ++ può aiutarti.

Nota per inciso che ho scambiato i ruoli di empty.txte full.txt, come suggerisce @Matthias.


6
La shell può aiutare con errori di ortografia. 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
Utilizzando lo strumento shellcheck puoi trovare correttamente gli errori di ortografia.
Yokai,

1
Sicuramente questo fallirà se il file non esiste neanche? Questo dovrebbe essere un controllo se il file è solo vuoto.
geedoubleya,

@geedoubleya: Certo. Questo è un punto ragionevole. Se l'esistenza del file fosse rilevante (come, ovviamente, potrebbe essere), allora si potrebbe adattare di conseguenza lo script. Se hai dato la sceneggiatura corretta come risposta e mi hai fatto il ping, avrei votato.
thb

1
Puoi ancheset -u
Jon McClung,

71
[ -s file.name ] || echo "file is empty"

8
[[-s file.name]] && echo "full" || echo "vuoto"
McPeppr

1
[[ -s file.name ]] || { [[ -f file.name ]] && echo 'empty' || echo 'does not exist'; }
intelligente l'

53

[[-s file]] -> Verifica se il file ha dimensioni maggiori di 0

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

Se necessario, controlla tutti i file * .txt nella directory corrente; e riporta tutto il file vuoto:

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

3
Non è necessario farlo $(ls *.txt, e in effetti non dovrebbe. Alcune persone hanno impostazioni predefinite per l' lsuso del formato lungo (come me) e la shell si espanderà già *.txtda sola. Basta for file in *.txtinvece.
Lilith,

Bello! Se desideri controllare tutti i file txt in modo ricorsivo, puoi utilizzare in findquesto modo:for file in $(find . -name '*.txt'); do if [[ ! -s $file ]]; then echo $file; fi; done
KlimczakM

1
Sottovalutato proprio per questo orribile anti-schema for file in $(ls *.txt); do. Si prega di utilizzare for file in *.txt; doinvece; si prega di leggere questa pagina di insidie ​​di Bash ; e per favore smetti di diffondere antipattern in questo modo.
gniourf_gniourf,

8

Mentre le altre risposte sono corrette, l'utilizzo "-s"dell'opzione mostrerà anche che il file è vuoto anche se il file non esiste.
Aggiungendo questo controllo aggiuntivo "-f"per vedere se il file esiste per primo, assicuriamo che il risultato sia corretto.

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

4

La risposta di @geedoubleya è la mia preferita.

Tuttavia, preferisco questo

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

3

Per verificare se il file è vuoto o contiene solo spazi bianchi , è possibile utilizzare grep:

if [[ -z $(grep '[^[:space:]]' $filename) ]] ; then
  echo "Empty file" 
  ...
fi

Questa è l'unica buona risposta e dovrebbe essere quella accettata. L'uso -snon risponde alla domanda. Cerca un file che esiste e ha una dimensione superiore a 0 byte.
Akito,

2

Molte delle risposte sono corrette ma credo che potrebbero essere più complete / semplicistiche ecc. Per esempio:

Esempio 1: istruzione if di base

# 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

se $ read_file è vuoto o no, ferma lo show con exit. Più di una volta ho letto male la risposta principale qui per dire il contrario.

Esempio 2: come funzione

# -- 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
}


0

Sono venuto qui alla ricerca di come eliminare i __init__.pyfile vuoti in quanto sono impliciti in Python 3.3+ e ho finito per usare:

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

Inoltre (almeno in zsh) usando $ path come la variabile interrompe anche il tuo $ PATH env e quindi romperà la tua shell aperta. Comunque, ho pensato di condividere!


0

Il modo più semplice per controllare il file è vuoto o meno:

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

Puoi anche scriverlo su una sola riga:

[ -s /path-to-file/filename.txt ] && echo "File is not empty" || echo "File is empty"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.