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

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

if [ -s diff.txt ]
then
        touch empty.txt
        rm full.txt
else
        touch full.txt
        rm emtpy.txt
fi
 Matthias01 апр. 2012 г., 15:48
[-s FILE] Истина, если FILE существует и имеет размер больше нуля. Таким образом, вы получите «empty.txt», если «diff.txt» не пустой.
 l0b002 апр. 2012 г., 15:13
PS: если вы хотите проверить фактическийdiff вызов, просто проверьте возвращаемое значение:if diff foo.txt bar.txt; then echo 'No difference'
 Alejandro Blasco20 февр. 2018 г., 16:18
Остерегайтесь конечных символов новой строки. Проверьте файл с$ cat diff.txt | hexdump -C
 David Ramirez13 июн. 2014 г., 22:44
Тест можно отменить:if [ ! -s diff.txt ]; then echo "IS EMPTY";else echo "HAS SOMETHING";fi

Ответы на вопрос(7)

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

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

не так ли? Проверьте правильность написания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.

 thb10 окт. 2017 г., 17:08
@geedoubleya: Конечно. Это разумный момент. Если бы существование файла было релевантным (как, конечно, могло бы быть), то можно соответствующим образом настроить скрипт. Если вы дали скорректированный скрипт какответ и пингнул меня, я бы проголосовал.
 Mike Q29 апр. 2018 г., 20:24
Я думаю, что лучший пример может быть использован здесь, более точно изменить full.txt и empty.txt на что-то, что имеет больше смысла в том, что проверяется ... Я склонен понизить,
 Yokai03 окт. 2016 г., 05:30
С помощью инструмента shellcheck можно найти орфографические ошибки просто отлично.
 William Pursell13 сент. 2016 г., 17:31
Оболочка может помочь с ошибками.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?}
 geedoubleya05 окт. 2017 г., 13:31
Конечно, это не удастся, если файл не существует либо? Предполагается, что это проверка, если файл пуст.

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

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

 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
 Lilith26 июн. 2018 г., 19:19
Вам не нужно делать$(ls *.txtи на самом деле не должен. Некоторые люди имеют значения по умолчанию дляls который использует длинный формат (как я), и оболочка уже будет расширяться*.txt сам по себе. Просто сделатьfor file in *.txt вместо.
 KlimczakM08 нояб. 2018 г., 08:28
Приятно! Если вы хотите проверить все текстовые файлы рекурсивно, вы можете использоватьfind нравится:for file in $(find . -name '*.txt'); do if [[ ! -s $file ]]; then echo $file; fi; done
 gniourf_gniourf23 янв. 2019 г., 17:34
Только что из-за этого ужасного анти-паттернаfor file in $(ls *.txt); do, Пожалуйста, используйтеfor file in *.txt; do вместо; пожалуйста прочтите этоСтраница Bash Pitfalls; и, пожалуйста, прекрати распространять антипаттерны, как это.
[ -s file.name ] || echo "file is empty"
 McPeppr29 янв. 2018 г., 21:27
[[-s file.name]] && echo "full" || эхо "пусто"
 smarber11 апр. 2018 г., 12:42
[[ -s file.name ]] || { [[ -f file.name ]] && echo 'empty' || echo 'does not exist'; }

Ваш ответ на вопрос