2012-04-01 5 views
88

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

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

[-s FILE] Истина, если FILE существует и имеет размер больше нуля. Таким образом, вы получаете «empty.txt», если «diff.txt» не пуст. – Matthias

+2

PS: Если вы хотите проверить фактический вызов 'diff', просто проверьте возвращаемое значение:' if diff foo.txt bar.txt; затем echo «Без разницы» – l0b0

+11

Тест можно отрицать: 'if [! -s diff.txt]; затем эхо «IS EMPTY», иначе эхо «HAT SOMETHING»; fi' –

ответ

124

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

+2

Оболочка может помочь с ошибками. 'Пусто = empty.txt; полный = full.txt; Diff = diff.txt; если [-s $ {diff?}]; то r = $ {empty?} t = $ {full?}; else r = $ {full?} t = $ {empty?}; Fi; rm $ {r?}; touch $ {t?} ' –

+0

С помощью инструмента shellcheck вы можете найти орфографические ошибки просто отлично. – Yokai

+1

Несомненно, это не сработает, если файл также не существует? Предполагается, что это проверка, если файл пуст. – geedoubleya

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

[[-s file.name]] && echo "full" || эхо "пустой" – McPeppr

11

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

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

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

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

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