Как проверить, пуст ли файл в Bash? - PullRequest
142 голосов
/ 01 апреля 2012

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

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

Ответы [ 8 ]

192 голосов
/ 01 апреля 2012

Неправильные орфографические ошибки, не так ли?Проверьте правильность написания 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.

60 голосов
/ 30 декабря 2014
[ -s file.name ] || echo "file is empty"
41 голосов
/ 09 мая 2017

[[-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
7 голосов
/ 05 октября 2017

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

@ 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
1 голос
/ 29 апреля 2018

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

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

0 голосов
/ 14 мая 2019
[[ -f filename && ! -s filename ]] && echo "filename exists and is empty"
0 голосов
/ 23 января 2019

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

...