web-dev-qa-db-ja.com

Bashでファイルが空かどうか調べる方法は?

Diff.txtというファイルがあります。空かどうか確認したいこのようなことをしましたが、それを動かすことができませんでした。

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

スペルミスはいらいらしますね。 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の役割を入れ替えたことに偶然に注目してください。

189
thb
[ -s file.name ] || echo "file is empty"
59
mickey white

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

他の答えは正しいですが、"-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
7
geedoubleya

@ 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
4
smarber

答えの多くは正しいですが、私はそれらがより完全な/単純化されたものなどであるかもしれないように私は感じます:例えば

# 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でshowを停止します。何度も私は反対を意味するためにここでトップの答えを読み違えていました。

1
Mike Q
[[ -f filename && ! -s filename ]] && echo "filename exists and is empty"

ファイルが空または空白のみかどうかを確認するには、grepを使用できます。

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

空の__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
SamMorrowDrums