2012-04-01 13 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が存在し、サイズが0より大きい場合は真です。 したがって、 "diff.txt"が空でない場合は "empty.txt"となります。 – Matthias

+2

PS:実際の 'diff'呼び出しをチェックしたい場合は、戻り値をチェックしてください:' if diff foo.txt bar.txt; then echo 'No difference'' – l0b0

+11

テストは否定できます: '[[! -s diff.txt]; echo "IS EMPTY"; else echo "HAS 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++コンパイラできるようなコンパイラのに対し、あなたを助けることができないということです助けます。

@Matthiasが示唆しているように、偶然にもempty.txtfull.txtの役割を交換したことに注目してください。

+2

シェルはスペルミスを助けることができます。 'empty = empty.txt; full = full.txt; diff = diff.txt; if [-s $ {diff?}];次に、r = $ {empty?} t = $ {full?};そうでなければr = $ {full?} t = $ {empty?}; fi; rm $ {r?}; touch $ {t?} ' –

+0

ツールのシェルチェックを使用すると、スペルミスがうまく見つかります。 – Yokai

+1

ファイルが存在しない場合、これは失敗しますか?これは、ファイルが空であるかどうかのチェックであると考えられます。 – geedoubleya

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

[[-sファイル名]] && 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 
関連する問題