Comment vérifier si un fichier est vide dans Bash?

184

J'ai un fichier appelé diff.txt. Vous voulez vérifier s'il est vide. J'ai fait quelque chose comme ça mais je n'ai pas pu le faire fonctionner.

if [ -s diff.txt ]
then
        touch empty.txt
        rm full.txt
else
        touch full.txt
        rm emtpy.txt
fi
Michigan
la source
24
[-s FILE] Vrai si FILE existe et a une taille supérieure à zéro. Ainsi, vous obtenez "empty.txt" si "diff.txt" n'est pas vide.
Matthias
2
PS: Si vous souhaitez vérifier un diffappel réel , il suffit de vérifier la valeur de retour:if diff foo.txt bar.txt; then echo 'No difference'
l0b0
20
Le test peut être annulé:if [ ! -s diff.txt ]; then echo "IS EMPTY";else echo "HAS SOMETHING";fi
David Ramirez
Méfiez-vous des caractères de fin de ligne. Consultez le fichier avec$ cat diff.txt | hexdump -C
Alejandro Blasco

Réponses:

225

Les fautes d'orthographe sont irritantes, n'est-ce pas? Vérifiez l'orthographe de empty, mais essayez également ceci:

#!/bin/bash -e

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

J'aime beaucoup les scripts shell, mais un inconvénient est que le shell ne peut pas vous aider lorsque vous avez mal orthographié, alors qu'un compilateur comme votre compilateur C ++ peut vous aider.

Notez d'ailleurs que j'ai échangé les rôles de empty.txtet full.txt, comme le suggère @Matthias.

thb
la source
6
Le shell peut aider à corriger les fautes d'orthographe. 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
L'utilisation de l'outil Shellcheck peut trouver des fautes d'orthographe très bien.
Yokai
1
Cela échouera sûrement si le fichier n'existe pas non plus? Ceci est censé être une vérification si le fichier est uniquement vide.
geedoubleya
@geedoubleya: Bien sûr. C'est un point raisonnable. Si l'existence du fichier était pertinente (comme, bien sûr, elle pourrait l'être), alors on pourrait ajuster le script en conséquence. Si vous donniez le script ajusté en guise de réponse et que vous me demandiez, je voterais.
thb
1
Vous pouvez aussiset -u
Jon McClung
71
[ -s file.name ] || echo "file is empty"
Mickey White
la source
8
[[-s fichier.nom]] && echo "plein" || echo "empty"
McPeppr
1
[[ -s file.name ]] || { [[ -f file.name ]] && echo 'empty' || echo 'does not exist'; }
smarber
53

[[-s file]] -> Vérifie si le fichier a une taille supérieure à 0

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

Si nécessaire, cela vérifie tous les fichiers * .txt dans le répertoire courant; et signale tout le fichier vide:

for file in *.txt; do if [[ ! -s $file ]]; then echo $file; fi; done
Surya
la source
3
Vous n'avez pas besoin de faire $(ls *.txt, et en fait, vous ne devriez pas. Certaines personnes ont défini des valeurs par défaut pour lscela utilisent le format long (comme moi) et le shell se développera déjà tout *.txtseul. Faites simplement à la for file in *.txtplace.
Lilith
Agréable! Si vous souhaitez vérifier tous les fichiers txt de manière récursive, vous pouvez utiliser findcomme ceci:for file in $(find . -name '*.txt'); do if [[ ! -s $file ]]; then echo $file; fi; done
KlimczakM
1
Voté à la baisse juste à cause de cet horrible anti-modèle for file in $(ls *.txt); do. Veuillez utiliser à la for file in *.txt; doplace; veuillez lire cette page Bash Pitfalls ; et arrêtez de répandre des antipatterns comme ça.
gniourf_gniourf
8

Bien que les autres réponses soient correctes, l'utilisation de l' "-s"option montrera également que le fichier est vide même si le fichier n'existe pas.
En ajoutant cette vérification supplémentaire "-f"pour voir si le fichier existe en premier, nous nous assurons que le résultat est correct.

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
la source
4

La réponse @geedoubleya est ma préférée.

Cependant, je préfère cela

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
plus simple
la source
3

Pour vérifier si le fichier est vide ou ne contient que des espaces blancs , vous pouvez utiliser grep:

if [[ -z $(grep '[^[:space:]]' $filename) ]] ; then
  echo "Empty file" 
  ...
fi
Noam Manos
la source
C'est la seule bonne réponse et devrait être celle acceptée. L'utilisation -sne répond pas à la question. Il recherche un fichier qui existe et dont la taille est supérieure à 0 octet.
Akito
2

Beaucoup de réponses sont correctes mais j'ai l'impression qu'elles pourraient être plus complètes / simplistes, etc. par exemple:

Exemple 1: instruction if de 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

si $ read_file est vide ou non, arrêtez le spectacle avec exit. Plus d'une fois, j'ai mal interprété la réponse principale ici pour signifier le contraire.

Exemple 2: en tant que fonction

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

Je suis venu ici pour savoir comment supprimer des __init__.pyfichiers vides car ils sont implicites dans Python 3.3+ et ont fini par utiliser:

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

De plus (au moins dans zsh) l'utilisation de $ path comme variable casse également votre env $ PATH et donc cela brisera votre shell ouvert. Bref, je pensais partager!

SamMorrowDrums
la source
0

Le moyen le plus simple de vérifier que le fichier est vide ou non:

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

Vous pouvez également l'écrire sur une seule ligne:

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