Bagaimana cara memeriksa apakah file kosong di Bash?

183

Saya punya file bernama diff.txt. Ingin memeriksa apakah kosong. Melakukan sesuatu seperti ini tetapi tidak bisa membuatnya bekerja.

if [ -s diff.txt ]
then
        touch empty.txt
        rm full.txt
else
        touch full.txt
        rm emtpy.txt
fi
Mich
sumber
24
[-s FILE] Benar jika FILE ada dan memiliki ukuran lebih besar dari nol. Dengan demikian, Anda mendapatkan "empty.txt" jika "diff.txt" tidak kosong.
Matthias
2
PS: Jika Anda ingin memeriksa diffpanggilan sebenarnya , cukup periksa nilai kembali:if diff foo.txt bar.txt; then echo 'No difference'
l0b0
20
Tes dapat dinegasikan:if [ ! -s diff.txt ]; then echo "IS EMPTY";else echo "HAS SOMETHING";fi
David Ramirez
Waspadalah terhadap karakter garis baru yang tertinggal. Periksa file dengan$ cat diff.txt | hexdump -C
Alejandro Blasco

Jawaban:

225

Salah eja menjengkelkan, bukan? Periksa ejaan Anda empty, tetapi kemudian coba juga ini:

#!/bin/bash -e

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

Saya suka banyak skrip shell, tetapi satu kelemahannya adalah bahwa shell tidak dapat membantu Anda ketika Anda salah mengeja, sedangkan kompiler seperti kompiler C ++ Anda dapat membantu Anda.

Perhatikan secara kebetulan bahwa saya telah bertukar peran empty.txtdan full.txt, seperti yang disarankan @Matthias.

thb
sumber
6
Shell dapat membantu kesalahan ejaan. 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
Menggunakan alat shellcheck dapat menemukan kesalahan ejaan dengan baik.
Yokai
1
Tentunya ini akan gagal jika file tersebut juga tidak ada? Ini seharusnya menjadi pemeriksaan jika file tersebut hanya kosong.
geedoubleya
@geedoubleya: Tentu. Itu poin yang masuk akal. Jika keberadaan file itu relevan (seperti, tentu saja, mungkin), maka orang dapat menyesuaikan skripnya. Jika Anda memberikan skrip yang disesuaikan sebagai jawaban dan mem-ping saya, saya akan menyesal.
thb
1
Anda juga dapatset -u
Jon McClung
71
[ -s file.name ] || echo "file is empty"
mickey white
sumber
8
[[-s file.name]] && echo "full" || gema "kosong"
McPeppr
1
[[ -s file.name ]] || { [[ -f file.name ]] && echo 'empty' || echo 'does not exist'; }
smarber
53

[[-s file]] -> Memeriksa apakah file memiliki ukuran lebih besar dari 0

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

Jika perlu, ini memeriksa semua file * .txt di direktori saat ini; dan melaporkan semua file kosong:

for file in *.txt; do if [[ ! -s $file ]]; then echo $file; fi; done
Surya
sumber
3
Anda tidak perlu melakukannya $(ls *.txt, dan sebenarnya seharusnya tidak. Beberapa orang memiliki pengaturan default untuk lsyang menggunakan format panjang (seperti saya) dan shell sudah akan berkembang *.txtsendiri. Lakukan saja for file in *.txtsebagai gantinya.
Lilith
Bagus! Jika Anda ingin memeriksa semua file txt secara rekursif, Anda dapat menggunakan findseperti ini:for file in $(find . -name '*.txt'); do if [[ ! -s $file ]]; then echo $file; fi; done
KlimczakM
1
Diturunkan hanya karena anti-pola yang mengerikan ini for file in $(ls *.txt); do. Silakan gunakan for file in *.txt; dosebagai gantinya; baca halaman Bash Pitfalls ini ; dan tolong hentikan penyebaran antipatterns seperti ini.
gniourf_gniourf
8

Sementara jawaban lain sudah benar, menggunakan "-s"opsi ini juga akan menunjukkan file kosong bahkan jika file tersebut tidak ada.
Dengan menambahkan cek tambahan ini "-f"untuk melihat apakah file tersebut ada terlebih dahulu, kami memastikan hasilnya benar.

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
geedoubleya
sumber
4

@geedoubleya jawabannya adalah favorit saya.

Namun, saya lebih suka ini

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
smarber
sumber
3

Untuk memeriksa apakah file kosong atau hanya memiliki spasi putih , Anda dapat menggunakan grep:

if [[ -z $(grep '[^[:space:]]' $filename) ]] ; then
  echo "Empty file" 
  ...
fi
Noam Manos
sumber
Ini adalah satu-satunya jawaban yang baik dan harus diterima. Menggunakan -stidak menjawab pertanyaan. Itu mencari file yang memang ada dan memiliki ukuran lebih dari 0 byte.
Akito
2

Banyak jawaban yang benar tetapi saya merasa mereka bisa lebih lengkap / simplistic dll. Misalnya:

Contoh 1: Dasar jika pernyataan

# 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

jika $ read_file kosong atau tidak hentikan acara dengan keluar. Lebih dari sekali saya salah membaca jawaban teratas di sini yang berarti sebaliknya.

Contoh 2: Sebagai fungsi

# -- 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
}
Mike Q
sumber
1
[[ -f filename && ! -s filename ]] && echo "filename exists and is empty"
Radek 'Goblin' Pieczonka
sumber
0

Saya datang ke sini mencari cara menghapus __init__.pyfile kosong karena mereka tersirat dalam Python 3.3+ dan akhirnya menggunakan:

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

Juga (setidaknya dalam zsh) menggunakan $ path sebagai variabel juga istirahat $ PATH Anda env dan itu akan merusak shell terbuka Anda. Ngomong-ngomong, kupikir aku akan berbagi!

SamMorrowDrums
sumber
0

Cara termudah untuk memeriksa file kosong atau tidak:

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

Anda juga dapat menulisnya dalam satu baris:

[ -s /path-to-file/filename.txt ] && echo "File is not empty" || echo "File is empty"
Nabeel Shaikh
sumber