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

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

Я написал сценарий bash примерно так, как показано ниже, но мне не удалось заставить его работать.

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

person Mich    schedule 01.04.2012    source источник
comment
[-s ФАЙЛ] Истинно, если ФАЙЛ существует и имеет размер больше нуля. Таким образом, вы получаете empty.txt, если diff.txt не пуст.   -  person Matthias    schedule 01.04.2012
comment
PS: Если вы хотите проверить реальный вызов diff, просто проверьте возвращаемое значение: if diff foo.txt bar.txt; then echo 'No difference'   -  person l0b0    schedule 02.04.2012
comment
Тест может быть отменен: if [ ! -s diff.txt ]; then echo "IS EMPTY";else echo "HAS SOMETHING";fi   -  person David Ramirez    schedule 14.06.2014
comment
Остерегайтесь завершающих символов новой строки. Извлеките файл с помощью $ cat diff.txt | hexdump -C   -  person Alejandro Blasco    schedule 20.02.2018


Ответы (9)


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

person thb    schedule 01.04.2012
comment
Оболочка может помочь с орфографическими ошибками. 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?} - person William Pursell; 13.09.2016
comment
С помощью инструмента shellcheck можно легко найти орфографические ошибки. - person Yokai; 03.10.2016
comment
Неужели это не удастся, если файла тоже не существует? Предполагается, что это только проверка, пуст ли файл. - person geedoubleya; 05.10.2017
comment
@geedoubleya: Конечно. Это разумный аргумент. Если бы существование файла было важным (а, конечно, могло бы быть), то можно было бы соответствующим образом скорректировать сценарий. Если бы вы дали скорректированный сценарий в качестве ответа и отправили мне ping, я бы проголосовал за. - person thb; 10.10.2017
comment
Я думаю, что здесь можно использовать лучший пример, точнее изменить full.txt и empty.txt на что-то, что имеет больше смысла в том, что проверяется ... У меня есть соблазн проголосовать против, - person Mike Q; 29.04.2018
comment
Вы также можете set -u - person Jon McClung; 20.08.2019
comment
@WilliamPursell, это '?' за в $ {word?}? - person Erwann; 02.08.2020
comment
@Erwann Я не понимаю вашего вопроса. Когда оболочка оценивает ${word?}, она выдает ошибку, если word не определено. - person William Pursell; 02.08.2020
comment
@WilliamPursell thx (в моем вопросе не было "чего") - person Erwann; 02.08.2020
comment
Какой аргумент -e передан здесь в shebang? - person Yatharth7; 14.10.2020

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

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

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

for file in *.txt; do if [ ! -s $file ]; then echo $file; fi; done
person Surya    schedule 09.05.2017
comment
Вам не нужно делать $(ls *.txt, да и не следует. Некоторые люди устанавливают для ls значения по умолчанию, которые используют длинный формат (например, я), и оболочка уже будет расширяться *.txt сама по себе. Просто сделайте for file in *.txt вместо этого. - person Lilith; 26.06.2018
comment
Хороший! Если вы хотите рекурсивно проверять все текстовые файлы, вы можете использовать find следующим образом: for file in $(find . -name '*.txt'); do if [[ ! -s $file ]]; then echo $file; fi; done - person KlimczakM; 08.11.2018

Хотя другие ответы верны, использование параметра "-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
person geedoubleya    schedule 05.10.2017
comment
Это правильный ответ. - person Christopher King; 10.12.2020

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

if [[ -z $(grep '[^[:space:]]' $filename) ]] ; then
  echo "Empty file" 
  ...
fi
person Noam Manos    schedule 08.08.2019
comment
Это единственный хороший ответ, и его следует принять. Использование -s не дает ответа на вопрос. Он ищет файл, который существует и имеет размер более 0 байт. - person Akito; 21.05.2020

Мой любимый ответ @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
person smarber    schedule 11.04.2018

Самый простой способ проверить, пуст файл или нет:

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

Вы также можете написать это в одной строке:

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

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

Пример 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 пуст или нет, остановите показ с помощью exit. Более чем однажды я неверно истолковал главный ответ здесь, что означал обратное.

Пример 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
}
person Mike Q    schedule 29.04.2018

Я пришел сюда, чтобы узнать, как удалить пустые файлы __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 env и, таким образом, ломает вашу открытую оболочку. Во всяком случае, думал, что поделюсь!

person SamMorrowDrums    schedule 23.01.2019

person    schedule
comment
[[-s file.name]] && echo full || эхо пусто - person McPeppr; 29.01.2018
comment
@smarber для такой простой проверки, пожалуйста, используйте [ ... ] вместо [[ ... ]]. Последнее - это bashism, который следует использовать только для несовместимых проверок bash (например, regexp). Если вам когда-нибудь случится написать что-нибудь, что должно быть переносимым для оболочки POSIX (например, системные скрипты Debian), вы сами оцените эту привычку :). - person pevik; 19.05.2021