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

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.


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"

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

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

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

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

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
}


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!


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"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.