Làm thế nào để kiểm tra nếu một tập tin trống trong Bash?


183

Tôi có một tập tin gọi là diff.txt. Muốn kiểm tra xem nó có trống không. Đã làm một cái gì đó như thế này nhưng không thể làm cho nó hoạt động.

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

24
[-s FILE] Đúng nếu FILE tồn tại và có kích thước lớn hơn 0. Do đó, bạn nhận được "blank.txt" nếu "diff.txt" không trống.
Matthias

2
PS: Nếu bạn muốn kiểm tra một diffcuộc gọi thực tế , chỉ cần kiểm tra giá trị trả về:if diff foo.txt bar.txt; then echo 'No difference'
l0b0

20
Kiểm tra có thể được phủ nhận:if [ ! -s diff.txt ]; then echo "IS EMPTY";else echo "HAS SOMETHING";fi
David Ramirez

Cẩn thận với các ký tự dòng mới. Kiểm tra tệp với$ cat diff.txt | hexdump -C
Alejandro Blasco

Câu trả lời:


225

Lỗi chính tả gây khó chịu phải không? Kiểm tra chính tả của bạn empty, nhưng sau đó cũng thử điều này:

#!/bin/bash -e

if [ -s diff.txt ]
then
        rm -f empty.txt
        touch full.txt
else
        rm -f full.txt
        touch empty.txt
fi

Tôi thích shell script rất nhiều, nhưng một nhược điểm của nó là shell không thể giúp bạn khi bạn viết sai chính tả, trong khi một trình biên dịch như trình biên dịch C ++ của bạn có thể giúp bạn.

Tình cờ nhận thấy rằng tôi đã hoán đổi vai trò của empty.txtfull.txt, như @Matthias gợi ý.


6
Vỏ có thể giúp với lỗi chính tả. 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
Sử dụng công cụ shellcheck có thể tìm thấy lỗi chính tả tốt.
Yokai

1
Chắc chắn điều này sẽ thất bại nếu tập tin không tồn tại? Đây được coi là một kiểm tra nếu tập tin chỉ trống.
geedoubleya

@geedoubleya: Chắc chắn rồi. Đó là một điểm hợp lý. Nếu sự tồn tại của tệp có liên quan (tất nhiên, có thể là như vậy), thì người ta có thể điều chỉnh tập lệnh cho phù hợp. Nếu bạn đưa ra kịch bản điều chỉnh dưới dạng câu trả lời và ping tôi, tôi sẽ nâng cấp.
THB

1
Bạn cũng có thểset -u
Jon McClung

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

8
[[-s file.name]] && echo "đầy đủ" || tiếng vang "trống rỗng"
McPeppr

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

53

[[-s file]] -> Kiểm tra xem tệp có kích thước lớn hơn 0 không

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

Nếu cần, điều này sẽ kiểm tra tất cả các tệp * .txt trong thư mục hiện tại; và báo cáo tất cả các tập tin trống:

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

3
Bạn không cần phải làm $(ls *.txt, và trên thực tế không nên. Một số người đã đặt mặc định cho lsviệc sử dụng định dạng dài (như tôi) và trình bao sẽ tự mở rộng *.txt. Chỉ cần làm for file in *.txtthay thế.
Lilith

Đẹp! Nếu bạn muốn kiểm tra đệ quy tất cả các tệp txt, bạn có thể sử dụng findnhư thế này:for file in $(find . -name '*.txt'); do if [[ ! -s $file ]]; then echo $file; fi; done
KlimczakM

1
Bị hạ bệ chỉ vì mô hình chống khủng khiếp này for file in $(ls *.txt); do. Vui lòng sử dụng for file in *.txt; dothay thế; xin vui lòng đọc trang Bash Cạm bẫy này ; và xin vui lòng ngừng lan truyền antipotype như thế này.
gniourf_gniourf

8

Trong khi các câu trả lời khác là chính xác, sử dụng "-s"tùy chọn cũng sẽ hiển thị tệp trống ngay cả khi tệp không tồn tại.
Bằng cách thêm kiểm tra bổ sung này "-f"để xem liệu tệp tồn tại trước tiên, chúng tôi đảm bảo kết quả là chính xác.

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 câu trả lời là yêu thích của tôi.

Tuy nhiên, tôi thích điều này

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

Để kiểm tra xem tệp có trống hay chỉ có khoảng trắng , bạn có thể sử dụng grep:

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

Đây là câu trả lời tốt duy nhất và nên được chấp nhận. Sử dụng -skhông trả lời câu hỏi. Nó tìm kiếm một tập tin tồn tại và có kích thước hơn 0 byte.
Akito

2

Nhiều câu trả lời là đúng nhưng tôi cảm thấy như chúng có thể hoàn chỉnh hơn / đơn giản hơn, v.v.

Ví dụ 1: Câu lệnh if cơ bản

# 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

nếu $ read_file trống hoặc không thì dừng chương trình với lối ra. Đã hơn một lần tôi đã đọc sai câu trả lời hàng đầu ở đây có nghĩa ngược lại.

Ví dụ 2: Là một hàm

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

Tôi đến đây để tìm cách xóa __init__.pycác tệp trống vì chúng ẩn trong Python 3.3+ và cuối cùng đã sử dụng:

find -depth '(' -type f  -name __init__.py ')' -print0 |
  while IFS= read -d '' -r file; do if [[ ! -s $file ]]; then rm $file; fi; done

Ngoài ra (ít nhất là trong zsh) bằng cách sử dụng $ path vì biến cũng phá vỡ env $ PATH của bạn và do đó, nó sẽ phá vỡ lớp vỏ mở của bạn. Dù sao, tôi muốn chia sẻ!


0

Cách dễ nhất để kiểm tra tệp có trống hay không:

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

Bạn cũng có thể viết nó trên một dòng duy nhất:

[ -s /path-to-file/filename.txt ] && echo "File is not empty" || echo "File is empty"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.