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이 존재하고 크기가 0보다 크면 True입니다. 따라서 "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
David Ramirez

후행 줄 바꿈 문자를주의하십시오. 다음을 통해 파일을 확인하십시오$ 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

나는 쉘 스크립팅을 많이 좋아하지만, 한 가지 단점은 철자가 틀렸을 때 쉘이 당신을 도울 수 없지만 C ++ 컴파일러와 같은 컴파일러가 당신을 도울 수 있다는 것입니다.

@Matthias가 제안한 것처럼 우연히 empty.txtand 의 역할을 바꿨습니다 full.txt.


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?}
William Pursell

1
도구 셸 검사를 사용하면 맞춤법 오류가 잘 나타납니다.
Yokai

1
파일이 존재하지 않으면 확실히 이것이 실패합니까? 파일이 비어 있는지 확인해야합니다.
geedoubleya

@geedoubleya : 물론입니다. 그것은 합리적인 지적입니다. 파일의 존재가 관련이 있다면 (물론 그럴 수도 있음) 스크립트를 적절히 조정할 수 있습니다. 조정 된 스크립트를 답변으로 제공 하고 저를 핑하면, 나는 공감합니다.
thb

1
당신은 또한 수set -u
존 McClung

70
[ -s file.name ] || echo "file is empty"

8
[[-s file.name]] && echo "full"|| echo "empty"
McPeppr

1
[[ -s file.name ]] || { [[ -f file.name ]] && echo 'empty' || echo 'does not exist'; }
smarber

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대신.
Lilith

좋은! 모든 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대신 사용하십시오 ; 이 Bash Pitfalls 페이지 를 읽으십시오 . 이런 식으로 반 패턴을 퍼 뜨리지 마십시오.
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파이썬 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

또한 변수로 $ path를 사용하면 (적어도 zsh에서는) $ 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"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.