Як перевірити, чи файл пустий у Bash?


184

У мене є файл, який називається diff.txt. Хочете перевірити, чи порожній він. Зробив щось подібне, але не міг змусити його працювати.

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

24
[-s FILE] Істинно, якщо FILE існує та має розмір більше нуля. Таким чином, ви отримуєте "empty.txt", якщо "diff.txt" не порожній.
Маттіас

2
PS: Якщо ви хочете перевірити фактичний diffдзвінок, просто перевірте значення повернення:if diff foo.txt bar.txt; then echo 'No difference'
l0b0

20
Тест можна заперечувати:if [ ! -s diff.txt ]; then echo "IS EMPTY";else echo "HAS SOMETHING";fi
Девід Рамірес

Слідкуйте за новими символами нового рядка. Перевірте файл з$ cat diff.txt | hexdump -C
Алехандро Бласко

Відповіді:


225

Неправильне написання дратує, чи не так? Перевірте написання 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.


6
Оболонка може допомогти в написанні помилок. 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?}
Вільям Перселл

1
Використовуючи схему інструмента, можна знайти помилки написання.
Йокай

1
Напевно це не вдасться, якщо файл також не існує? Це має бути перевірка, чи файл лише порожній.
geedoubleya

@geedoubleya: Звичайно. Це розумний момент. Якщо існування файлу було релевантним (як це, звичайно, могло бути), то можна змінити сценарій відповідно. Якщо ви дали скоригований сценарій як відповідь і подали мені поштовх, я б схвалив пропозицію.
вт

1
Можна такожset -u
Джон МакКлунг


53

[[-s файл]] -> Перевіряє, чи розмір файлу перевищує 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

3
Вам не потрібно робити $(ls *.txt, а насправді не слід. Деякі люди мають встановлені за замовчуванням, lsякі використовують довгий формат (як я), і оболонка вже розшириться *.txtсамостійно. Просто зробіть for file in *.txtзамість цього.
Ліліт

Приємно! Якщо ви хочете рекурсивно перевіряти всі файли txt, ви можете скористатися findтаким чином:for file in $(find . -name '*.txt'); do if [[ ! -s $file ]]; then echo $file; fi; done
KlimczakM

1
Відмовились саме від цієї жахливої ​​анти-моделі for file in $(ls *.txt); do. Будь ласка, використовуйте for file in *.txt; doзамість цього; будь ласка, прочитайте цю сторінку підводних каменів ; і, будь ласка, припиніть поширювати подібні малюнки.
gniourf_gniourf

8

Хоча інші відповіді правильні, використання "-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

Відповідь @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

3

Щоб перевірити, чи файл порожній або має лише пробіли , ви можете використовувати grep:

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

Це єдина хороша відповідь і повинна бути прийнятою. Використання -sне дає відповіді на запитання. Він шукає файл, який існує, і має розмір більше 0 байт.
Акіто

2

Багато відповідей є правильними, але я вважаю, що вони можуть бути більш повними / спрощеними тощо, наприклад:

Приклад 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
}


0

Я прийшов сюди, шукаючи, як видалити порожні __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, і тому вона порушить вашу відкриту оболонку. У всякому разі, думав, що поділюсь!


0

Найпростіший спосіб перевірити, чи файл порожній чи ні:

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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.