Как проверить, пуст ли файл в Bash?

У меня есть файл под названием дифф.формат txt. Хотите проверить, если он пуст. Сделал что-то вроде этого, но не смог заставить его работать.

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

6 ответов


опечатки раздражают, не так ли? Проверьте правописание empty, но затем также попробуйте следующее:

#!/bin/bash -e

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

мне очень нравится сценарий оболочки, но один из его недостатков заключается в том, что оболочка не может помочь вам, когда вы ошибаетесь, в то время как компилятор, такой как ваш компилятор C++, может помочь вам.

обратите внимание, кстати, что я поменялся ролями empty.txt и full.txt, как предлагает @Matthias.


[ -s file.name ] || echo "file is empty"

[[- s file ]] -- > проверяет, имеет ли файл размер больше 0

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

при необходимости, проверяет все *.txt-файлы в текущем каталоге; и сообщает обо всех пустых файлах:

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

В то время как другие ответы верны, используя "-s" опция также покажет, что файл пуст, даже если файл не существует.
Добавив эту дополнительную проверку "-f" чтобы увидеть, существует ли файл сначала, мы гарантируем, что результат правильный.

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 ответ мой любимый.

однако, я предпочитаю этот

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

многие ответы верны, но я чувствую, что они могут быть более полными / упрощенно и т. д. например :

# 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

если $read_file пуст или нет, остановите шоу с выходом. Не раз я неправильно истолковывал верхний ответ здесь, чтобы означать противоположное.