Bashでファイルが空かどうかを確認するにはどうすればよいですか?


183

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が存在し、サイズがゼロより大きい場合は真。したがって、「diff.txt」が空でない場合、「empty.txt」を取得します。
Matthias

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
Alejandro Blasco

回答:


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

私はシェルスクリプトを非常に気に入っていますが、1つ不利な点は、スペルが間違っているとシェルが役に立たないのに対し、C ++コンパイラのようなコンパイラが役立つことです。

私はの役割を入れ替えていることを偶然に注意してくださいempty.txtfull.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
shellcheckツールを使用すると、スペルミスをうまく見つけることができます。
妖怪

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

@geedoubleya:はい。それは合理的なポイントです。ファイルの存在が関連している場合(もちろん、そうである可能性がある場合)は、それに応じてスクリプトを調整します。調整されたスクリプトを回答として提供して私にpingを送信した場合、賛成票を投じます。
2017年

1
次のこともできますset -u
Jon McClung


53

[[-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

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); dofor file in *.txt; do代わりに使用してください。このBashの落とし穴のページを読んでください。このようなアンチパターンの拡散をやめてください。
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が空であるか存在しない場合は、exitでショーを停止します。何度も私はここで一番上の答えを誤解して反対を意味しました。

例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環境も破壊されるため、開いているシェルも破壊されます。とにかく、共有したいと思いました!


0

ファイルが空かどうかを確認する最も簡単な方法:

if [ -s /path-to-file/filename.txt ]
then
     echo "File is not empty"
else
     echo "File is empty"
fi

また、1行で記述することもできます。

[ -s /path-to-file/filename.txt ] && echo "File is not empty" || echo "File is empty"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.