332 votes

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

J'ai un fichier appelé diff.txt . Je veux vérifier si elle est vide.

J'ai écrit un bash script quelque chose comme ci-dessous, mais je n'ai pas réussi à le faire fonctionner.

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

48 votes

[ -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.

3 votes

PS : Si vous voulez vérifier un diff il suffit de vérifier la valeur de retour : if diff foo.txt bar.txt; then echo 'No difference'

38 votes

Le test peut être annulé : if [ ! -s diff.txt ]; then echo "IS EMPTY";else echo "HAS SOMETHING";fi

399voto

thb Points 4370

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

#!/bin/bash -e

if [ -s diff.txt ]; then
        # The file is not-empty.
        rm -f empty.txt
        touch full.txt
else
        # The file is empty.
        rm -f full.txt
        touch empty.txt
fi

J'aime beaucoup les scripts shell, mais l'un de leurs inconvénients est que le shell ne peut pas vous aider lorsque vous faites des fautes d'orthographe, alors qu'un compilateur comme votre compilateur C++ peut vous aider.

Notez incidemment que j'ai interverti les rôles de empty.txt et full.txt comme le suggère @Matthias.

13 votes

Le coquillage 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?}

4 votes

L'outil shellcheck permet de trouver les erreurs d'orthographe sans problème.

1 votes

Cela échouera sûrement si le fichier n'existe pas non plus ? C'est censé être une vérification si le fichier est vide uniquement.

125voto

mickey white Points 871
[ -s file.name ] || echo "file is empty"

22 votes

[[ -s file.name ]] && echo "full" || echo "empty"

1 votes

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

3 votes

@smarber pour une vérification simple comme celle-ci, veuillez utiliser [ ... ] au lieu de [[ ... ]] . Ce dernier est un bashisme, qui ne devrait être utilisé que pour des vérifications bash incompatibles (par exemple regexp). S'il vous arrive d'écrire quelque chose qui devrait être portable par le shell POSIX (par exemple le système Debian scripts), vous apprécierez vous-même cette habitude :).

80voto

Surya Points 4152

[ -s file ] # Checks if file has size greater than 0

[ -s diff.txt ] && echo "file has something" || echo "file is empty"

Si nécessaire, ceci vérifie tous les fichiers *.txt dans le répertoire courant ; et rapporte tous les fichiers vides :

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

4 votes

Vous n'avez pas besoin de faire $(ls *.txt et, en fait, ne devrait pas l'être. Certaines personnes ont défini des valeurs par défaut pour ls qui utilisent le format long (comme moi) et le shell sera déjà étendu *.txt par lui-même. Il suffit de faire for file in *.txt à la place.

0 votes

Joli ! Si vous voulez vérifier tous les fichiers txt de manière récursive, vous pouvez utiliser find comme ça : for file in $(find . -name '*.txt'); do if [[ ! -s $file ]]; then echo $file; fi; done

27voto

Noam Manos Points 145

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

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

6 votes

C'est la seule bonne réponse et elle devrait être acceptée. Utilisation de -s ne répond pas à la question. Il cherche un fichier qui existe et dont la taille est supérieure à 0 octet.

19voto

geedoubleya Points 21

Bien que les autres réponses soient correctes, utiliser le "-s" l'option montrera également que le fichier est vide même si le fichier n'existe pas.
En ajoutant ce contrôle supplémentaire "-f" pour voir si le fichier existe d'abord, 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

0 votes

C'est la bonne réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X