web-dev-qa-db-fra.com

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

J'ai un fichier appelé diff.txt. Vous voulez vérifier si c'est vide. J'ai fait quelque chose comme ça mais je ne pouvais pas le faire fonctionner.

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

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 en cas d'erreur, alors qu'un compilateur comme votre compilateur C++ peut vous aider.

Remarquez par ailleurs que j'ai échangé les rôles de empty.txt et full.txt, comme le suggère @Matthias.

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

[[-s fichier]] -> Vérifie si la taille du fichier est 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 du répertoire en cours; et signale tout le fichier vide:

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

Bien que les autres réponses soient correctes, l'utilisation de l'option "-s" indiquera également que le fichier est vide, même s'il 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
4
geedoubleya

@geedoubleya answer est mon préféré.

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

La plupart des réponses sont correctes mais j’ai l’impression qu’elles pourraient être plus complètes /simpliste etc. par exemple:

# 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ête le show avec exit. Plus d’une fois, j’ai mal interprété la réponse figurant en haut pour indiquer le contraire. 

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

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

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

Je suis venu ici pour savoir comment supprimer les fichiers __init__.py vides car ils sont implicites dans Python 3.3+ et que j'ai 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 en zsh), utiliser $ path en tant que variable interrompt également votre envoi $ PATH et ainsi, votre shell ouvert sera brisé. Quoi qu'il en soit, je pensais partager!

0
SamMorrowDrums