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

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

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

Ответ 1

Ошибки раздражают, не так ли? Проверьте правильность написания 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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

В то время как другие ответы верны, использование опции "-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

Ответ 5

@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

Ответ 6

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

Пример 1. Базовый оператор if

# 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 пуст или нет, остановите показ с выходом. Я не раз неправильно читал верхний ответ, чтобы обозначить обратное.

Пример 2: как функция

# -- 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
}

Ответ 7

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

Ответ 8

Чтобы проверить, является ли файл пустым или имеет только пробелы, вы можете использовать grep:

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

Ответ 9

Я пришел сюда в поисках того, как удалить пустые файлы __init__.py поскольку они неявны в Python 3. 3+, и в итоге использовал:

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

Также (по крайней мере, в zsh) использование $ path в качестве переменной также нарушает вашу среду $ PATH и, таким образом, разрушает вашу открытую оболочку. Во всяком случае, думал, что я поделюсь!