Bash'ta bir dosyanın boş olup olmadığını nasıl kontrol edebilirim?


184

Diff.txt adlı bir dosyam var. Boş olup olmadığını kontrol etmek istiyorum. Böyle bir şey yaptım ama çalışamadı.

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

24
[-s FILE] DOSYA varsa ve boyutu sıfırdan büyükse doğrudur. Böylece, "diff.txt" boş değilse "empty.txt" elde edersiniz.
Matthias

2
Not: Gerçek bir diffçağrıyı kontrol etmek istiyorsanız , sadece dönüş değerini kontrol edin:if diff foo.txt bar.txt; then echo 'No difference'
l0b0

20
Test reddedilebilir:if [ ! -s diff.txt ]; then echo "IS EMPTY";else echo "HAS SOMETHING";fi
David Ramirez

Sondaki yeni satır karakterlerine dikkat edin. Dosyayı kontrol et$ cat diff.txt | hexdump -C
Alejandro Blasco

Yanıtlar:


225

Yazım hataları sinir bozucu, değil mi? Yazımınızı kontrol edin empty, ancak bunu da deneyin:

#!/bin/bash -e

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

Ben kabuk komut dosyası çok seviyorum, ama bunun bir dezavantajı kabuk yanlış yazarken size yardımcı olamaz, C ++ derleyici gibi bir derleyici size yardımcı olabilir.

Bu arada, @Matthias'ın önerdiği gibi empty.txtve rollerini değiştirdiğime dikkat edin full.txt.


6
Kabuk yazım hatalarına yardımcı olabilir. 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
Kabuk aracını kullanarak yazım hatalarını bulabilirsiniz.
Yokai

1
Şüphesiz dosya da yoksa bu başarısız olur mu? Bunun yalnızca dosyanın boş olup olmadığını kontrol etmesi gerekiyor.
geedoubleya

@geedoubleya: Tabii. Bu makul bir nokta. Dosyanın varlığı konuyla ilgiliyse (elbette olduğu gibi), komut dosyasını buna göre ayarlayabilir. Düzeltilmiş senaryoyu bir cevap olarak verdiyseniz ve bana ping attıysanız, vekalet ederim.
thb

1
Ayrıca yapabilirsinizset -u
Jon McClung

71
[ -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]] -> Dosyanın boyutu 0'dan büyük olup olmadığını kontrol eder

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

Gerekirse, geçerli dizindeki tüm * .txt dosyalarını denetler; ve tüm boş dosyaları bildirir:

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

3
Yapmanıza gerek yok $(ls *.txtve aslında gerek yok. Bazı insanlar bunun için varsayılan lsolarak uzun formatı (benim gibi) kullanırlar ve kabuk zaten *.txtkendi kendine genişler . Bunun for file in *.txtyerine yap.
Lilith

Güzel! Tüm txt dosyalarını tekrar tekrar kontrol etmek isterseniz, şu şekilde kullanabilirsiniz find:for file in $(find . -name '*.txt'); do if [[ ! -s $file ]]; then echo $file; fi; done
KlimczakM

1
Sadece bu korkunç anti-desen nedeniyle indirildi for file in $(ls *.txt); do. Lütfen for file in *.txt; dobunun yerine kullanın; lütfen bu Bash Tuzaklar sayfasını okuyun ; ve bunun gibi anti-desenleri yaymayı bırakın.
gniourf_gniourf

8

Diğer yanıtlar doğru olmakla birlikte, "-s"seçeneği kullanmasanız bile, seçeneği kullanmak dosyanın boş olduğunu gösterecektir. Dosyanın önce var
olup "-f"olmadığını görmek için bu ek denetimi ekleyerek sonucun doğru olduğundan emin oluruz.

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 cevabı benim favorim.

Ancak bunu tercih ederim

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

Dosyanın boş olup olmadığını veya yalnızca beyaz boşluk olup olmadığını kontrol etmek için grep'i kullanabilirsiniz:

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

Bu tek iyi cevap ve kabul edilen cevap olmalı. Kullanmak -ssoruya cevap vermez. Var olan ve 0 bayttan daha büyük bir dosya arar.
Akito

2

Cevapların çoğu doğrudur, ancak daha eksiksiz / basit vb.

Örnek 1: Temel if ifadesi

# 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 boşsa veya orada değilse, çıkışı çıkışla durdurun. Bir kereden fazla, tam tersini söylemek için üstteki cevabı yanlış okudum.

Örnek 2: İşlev olarak

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

Buraya __init__.pyPython 3.3+ ile örtük oldukları için boş dosyaların nasıl silineceğini aramaya geldim ve aşağıdakileri kullanarak bitirdim:

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

Ayrıca (en azından zsh cinsinden) değişken olarak $ yolunu kullanmak da $ PATH env'nizi bozar ve böylece açık kabuğunuzu kırar. Her neyse, paylaşacağımı düşündüm!


0

Dosyayı kontrol etmenin en kolay yolu boş veya değil:

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

Ayrıca tek bir satıra da yazabilirsiniz:

[ -s /path-to-file/filename.txt ] && echo "File is not empty" || echo "File is empty"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.