Wie überprüfe ich, ob eine Datei in Bash leer ist?

183

Ich habe eine Datei namens diff.txt. Möchten Sie überprüfen, ob es leer ist. Habe so etwas gemacht, konnte es aber nicht zum Laufen bringen.

if [ -s diff.txt ]
then
        touch empty.txt
        rm full.txt
else
        touch full.txt
        rm emtpy.txt
fi
Mich
quelle
24
[-s FILE] True, wenn FILE vorhanden ist und eine Größe größer als Null hat. Sie erhalten also "empty.txt", wenn "diff.txt" nicht leer ist.
Matthias
2
PS: Wenn Sie einen tatsächlichen diffAnruf überprüfen möchten, überprüfen Sie einfach den Rückgabewert:if diff foo.txt bar.txt; then echo 'No difference'
l0b0
20
Test kann negiert werden:if [ ! -s diff.txt ]; then echo "IS EMPTY";else echo "HAS SOMETHING";fi
David Ramirez
Achten Sie auf die nachgestellten Zeilenumbrüche. Überprüfen Sie die Datei mit$ cat diff.txt | hexdump -C
Alejandro Blasco

Antworten:

224

Rechtschreibfehler sind irritierend, nicht wahr? Überprüfen Sie Ihre Rechtschreibung von empty, aber versuchen Sie dann auch Folgendes:

#!/bin/bash -e

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

Ich mag Shell-Skripte sehr, aber ein Nachteil ist, dass die Shell Ihnen nicht helfen kann, wenn Sie falsch schreiben, während ein Compiler wie Ihr C ++ - Compiler Ihnen helfen kann.

Beachten Sie übrigens, dass ich die Rollen von empty.txtund getauscht habe full.txt, wie @Matthias vorschlägt.

thb
quelle
6
Die Shell kann bei Rechtschreibfehlern helfen. 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
Mit dem Tool Shellcheck können Rechtschreibfehler gut gefunden werden.
Yokai
1
Dies wird sicherlich fehlschlagen, wenn die Datei auch nicht existiert? Dies soll eine Überprüfung sein, ob die Datei nur leer ist.
Geedoubleya
@geedoubleya: Sicher. Das ist ein vernünftiger Punkt. Wenn die Existenz der Datei relevant wäre (wie es natürlich sein könnte), könnte man das Skript entsprechend anpassen. Wenn Sie das angepasste Skript als Antwort geben und mich anpingen würden, würde ich zustimmen.
10.
1
Sie können auchset -u
Jon McClung
70
[ -s file.name ] || echo "file is empty"
mickey weiß
quelle
8
[[-s Dateiname]] && echo "full" || Echo "leer"
McPeppr
1
[[ -s file.name ]] || { [[ -f file.name ]] && echo 'empty' || echo 'does not exist'; }
smarber
53

[[-s Datei]] -> Überprüft, ob die Datei größer als 0 ist

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

Bei Bedarf werden alle * .txt-Dateien im aktuellen Verzeichnis überprüft. und meldet alle leeren Dateien:

for file in *.txt; do if [[ ! -s $file ]]; then echo $file; fi; done
Surya
quelle
3
Sie müssen nicht $(ls *.txtund sollten es auch nicht. Einige Leute haben Standardeinstellungen für lsdas Langformat festgelegt (wie ich) und die Shell wird bereits von selbst erweitert *.txt. Mach es einfach for file in *.txtstattdessen.
Lilith
Nett! Wenn Sie alle txt-Dateien rekursiv überprüfen möchten, können Sie Folgendes verwenden find:for file in $(find . -name '*.txt'); do if [[ ! -s $file ]]; then echo $file; fi; done
KlimczakM
1
Nur wegen dieses schrecklichen Anti-Musters herabgestimmt for file in $(ls *.txt); do. Bitte verwenden Sie for file in *.txt; dostattdessen; Bitte lesen Sie diese Bash Pitfalls-Seite . und bitte hör auf, solche Antimuster zu verbreiten.
gniourf_gniourf
8

Während die anderen Antworten korrekt sind, zeigt die Verwendung der "-s"Option auch an, dass die Datei leer ist, auch wenn die Datei nicht vorhanden ist.
Durch Hinzufügen dieser zusätzlichen Prüfung, "-f"um festzustellen, ob die Datei zuerst vorhanden ist, stellen wir sicher, dass das Ergebnis korrekt ist.

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

@geououbleya Antwort ist mein Favorit.

Ich bevorzuge dies jedoch

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
quelle
3

Um zu überprüfen, ob die Datei leer ist oder nur Leerzeichen enthält , können Sie grep verwenden:

if [[ -z $(grep '[^[:space:]]' $filename) ]] ; then
  echo "Empty file" 
  ...
fi
Noam Manos
quelle
Dies ist die einzig gute Antwort und sollte die akzeptierte sein. Verwenden -sbeantwortet die Frage nicht. Es wird nach einer Datei gesucht, die vorhanden ist und eine Größe von mehr als 0 Byte hat.
Akito
2

Viele der Antworten sind richtig, aber ich denke, sie könnten vollständiger / einfacher usw. sein, zum Beispiel:

Beispiel 1: Grundlegende if-Anweisung

# 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

Wenn $ read_file leer ist oder nicht, stoppen Sie die Show mit exit. Mehr als einmal habe ich die Top-Antwort hier falsch verstanden, um das Gegenteil zu bedeuten.

Beispiel 2: Als Funktion

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

Ich bin hierher gekommen, um zu suchen, wie leere __init__.pyDateien gelöscht werden können, da sie in Python 3.3+ enthalten sind, und habe am Ende Folgendes verwendet:

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

Wenn Sie (zumindest in zsh) $ path als Variable verwenden, wird auch Ihre $ PATH-Umgebung beschädigt, sodass Ihre offene Shell beschädigt wird. Wie auch immer, dachte ich würde teilen!

SamMorrowDrums
quelle
0

Der einfachste Weg, eine Datei zu überprüfen, ist leer oder nicht:

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

Sie können es auch in einer Zeile schreiben:

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