it-swarm.com.de

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

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
127
Mich

Rechtschreibfehler irritieren, nicht wahr? Überprüfen Sie Ihre Schreibweise von empty, versuchen Sie es dann aber auch:

#!/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-Scripting sehr gerne, aber ein Nachteil ist, dass die Shell Ihnen nicht helfen kann, wenn Sie Rechtschreibfehler machen. Ein Compiler wie Ihr C++ - Compiler kann Ihnen dabei helfen.

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

176
thb
[ -s file.name ] || echo "file is empty"
52
mickey white

[[-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 geprüft. und meldet alle leeren Dateien:

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

Während die anderen Antworten korrekt sind, zeigt die Verwendung der Option "-s" auch, dass die Datei leer ist, auch wenn die Datei nicht vorhanden ist.
Durch Hinzufügen dieser zusätzlichen Überprü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
4
geedoubleya

@geedoubleya 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
3
smarber

Viele der Antworten sind korrekt, aber ich habe das Gefühl, sie könnten vollständiger sein./vereinfachend usw. zum Beispiel:

# 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, wird die Show mit exit beendet. Mehr als einmal habe ich die oberste Antwort hier falsch verstanden, um das Gegenteil zu bedeuten. 

1
Mike Q
[[ -f filename && ! -s filename ]] && echo "filename exists and is empty"

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
0
Noam Manos

Ich kam hierher und suchte, wie leere __init__.py-Dateien gelöscht werden sollten, da sie in Python 3.3+ implizit enthalten sind, und endete mit:

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

Auch (zumindest in zsh) bricht die Verwendung von $ path als Variable die $ PATH-Umgebung und damit die geöffnete Shell. Jedenfalls dachte ich würde teilen!

0
SamMorrowDrums