Saya punya skrip yang memeriksa ukuran 0, tapi saya pikir pasti ada cara yang lebih mudah untuk memeriksa ukuran file. Yaitu file.txt
biasanya 100rb; cara membuat skrip memeriksa apakah kurang dari 90k (termasuk 0), dan membuatnya mendapatkan salinan baru karena file rusak dalam kasus ini.
Apa yang saya gunakan saat ini ..
if [ -n file.txt ]
then
echo "everything is good"
else
mail -s "file.txt size is zero, please fix. " myemail@gmail.com < /dev/null
# Grab wget as a fallback
wget -c https://www.server.org/file.txt -P /root/tmp --output-document=/root/tmp/file.txt
mv -f /root/tmp/file.txt /var/www/file.txt
fi
Jawaban:
[ -n file.txt ]
tidak memeriksa ukurannya, memeriksa stringfile.txt
yang panjangnya tidak nol, sehingga senantiasa berhasil.Jika Anda ingin mengatakan "ukurannya bukan nol", Anda perlu
[ -s file.txt ]
.Untuk mendapatkan ukuran file, Anda bisa menggunakan
wc -c
untuk mendapatkan ukuran (panjang file) dalam byte:Dalam hal ini, sepertinya itulah yang Anda inginkan.
Tapi FYI, jika Anda ingin tahu berapa banyak ruang disk yang digunakan file, Anda bisa menggunakan
du -k
untuk mendapatkan ukuran (ruang disk yang digunakan) dalam kilobyte:Jika Anda membutuhkan kontrol lebih besar atas format output, Anda juga dapat melihatnya
stat
. Di Linux, Anda akan mulai dengan sesuatu sepertistat -c '%s' file.txt
, dan pada BSD / Mac OS X, sesuatu sepertistat -f '%z' file.txt
.sumber
du -b "$file" | cut -f 1
bukannyastat -c '%s' "$file"
? Ataustat --printf="%s" "$file"
?stat
memiliki flag yang berbeda.... | cut -d' ' -f1
untuk membuatnya bekerja di Ubuntu.wc -c < "$file"
(perhatikan<
), dalam hal ini Anda tidak memerlukan| cut ...
bagian (yang, seperti yang diposting, tidak berfungsi pada OSX). Nilai minimumBLOCKSIZE
untukdu
pada OSX adalah512
.wc -c <filename
juga menggunakanfstat
danseek
? Catatan yangfstat
membutuhkan fd, bukan pathname.Itu mengejutkan saya bahwa tidak ada yang disebutkan
stat
untuk memeriksa ukuran file. Beberapa metode pasti lebih baik: menggunakan-s
untuk mengetahui apakah file itu kosong atau tidak lebih mudah dari yang lainnya jika itu yang Anda inginkan. Dan jika Anda ingin mencari file dengan ukuran,find
tentu cara untuk melakukannya.Saya juga suka
du
banyak mendapatkan ukuran file dalam kb, tetapi, untuk byte, saya akan menggunakanstat
:sumber
stat
adalah ide yang bagus, tetapi pada CentOS inilah yang bekerja untuk saya:size=$(stat -c%s $filename)
stat
menjadi hal yang benar dalam beberapa situasi, dan file jarang tidak relevan dalam kebanyakan situasi, meskipun tentu saja tidak semua.solusi alternatif dengan kurung awk dan double:
sumber
du
tidak mendukung-b
. (Ini mungkin menjadi pilihan gaya sadar, tetapi hanya untuk menyebutkan alternatif: Anda dapat menghilangkan$
dalam awalan(( ... ))
ketika referensi variabel:((SIZE<90000))
)$
awk
dengan menggunakanread
(bash
perintah internal):read SIZE _ <<<$(du -sb "$FILENAME")
Jika Anda
find
menangani sintaks ini, Anda dapat menggunakannya:Ini akan menghasilkan
file.txt
stdout jika dan hanya jika ukuranfile.txt
kurang dari 90k. Untuk menjalankan skripscript
jikafile.txt
memiliki ukuran kurang dari 90k:sumber
find . -maxdepth 1 -name "file.txt" -size -90k
Jika Anda mencari ukuran file saja:
sumber
wc -c "$file"
diberikan sebagai jawaban pada tahun 2011 (tiga tahun lalu). Ya,wc -c "$file"
memiliki masalah saat menampilkan nama file serta jumlah karakter, sehingga jawaban awal menambahkan perintah untuk memisahkan jumlah. Tapiwc -c < "$file"
, yang memperbaiki masalah itu, ditambahkan sebagai komentar pada Mei 2014. Jawaban Anda setara dengan itu, kecuali itu menambahkan "penggunaan yang tidak bergunacat
" . Juga, Anda harus mengutip semua referensi variabel shell kecuali Anda memiliki alasan yang bagus untuk tidak melakukannya.Ini berfungsi baik di linux dan makro
sumber
stat tampaknya melakukan ini dengan panggilan sistem paling sedikit:
sumber
strace du --bytes $1 2>&1 >/dev/null | wc
Jika demikian, maka pada arsitektur amd64 pada ArchLinux (biasanya versi terbaru dari semuanya) Saya memiliki 45 baris untukdu
, 46 baris untukstat
, 47 baris untukwc
dan 72 baris untukfind
.portabel, semua rasa python, menghindari variasi dalam dialek stat
sumber
Untuk mendapatkan ukuran file di Linux dan Mac OS X (dan mungkin BSD lainnya), tidak ada banyak pilihan, dan sebagian besar yang disarankan di sini hanya akan bekerja pada satu sistem.
Diberikan
f=/path/to/your/file
,apa yang berfungsi di Linux dan Mac Bash:
atau
Jawaban lain berfungsi dengan baik di Linux, tetapi tidak di Mac:
du
tidak memiliki-b
opsi di Mac, dan trik BLOCKSIZE = 1 tidak berfungsi ("bloksize minimum adalah 512", yang mengarah ke hasil yang salah)cut -d' ' -f1
tidak berfungsi karena di Mac, jumlahnya mungkin lurus, diisi dengan spasi di depan.Jadi, jika Anda membutuhkan sesuatu yang fleksibel, itu baik
perl
's-s
operator, atauwc -c
disalurkan keawk '{print $1}'
(awk akan mengabaikan spasi terkemuka).Dan tentu saja, mengenai sisa pertanyaan awal Anda, gunakan
-lt
(atau-gt
) operator:if [ $size -lt $your_wanted_size ]; then
dll.sumber
size=$(wc -c < "$f")
(perhatikan<
, yang menyebabkanwc
hanya melaporkan angka). Perbandingan ulang: jangan lupa lebih banyak "bash-ful"if (( size < your_wanted_size )); then ...
(dan juga[[ $size -lt $your_wanted_size ]]
).Berdasarkan jawaban gniourf_gniourf,
akan menulis
file.txt
ke stdout jika dan hanya jika ukuranfile.txt
kurang dari 90K, danakan menjalankan perintah
command
jikafile.txt
memiliki ukuran kurang dari 90K. Saya sudah menguji ini di Linux. Darifind(1)
,(penekanan ditambahkan).
sumber
dengan asumsi bahwa perintah ls melaporkan file pada kolom # 6
sumber
Saya akan menggunakan
du
's--threshold
untuk ini. Tidak yakin apakah opsi ini tersedia di semua versidu
tetapi ini diterapkan dalam versi GNU.Mengutip dari du (1) manual:
Inilah solusi saya, gunakan
du --threshold=
untuk kasus penggunaan OP:Keuntungan dari itu, adalah bahwa
du
dapat menerima argumen untuk opsi itu dalam format yang dikenal - baik manusia seperti dalam10K
,10MiB
atau apa pun yang Anda merasa nyaman dengan - Anda tidak perlu mengkonversi secara manual antara format / unit karenadu
menangani itu.Untuk referensi, inilah penjelasan tentang
SIZE
argumen ini dari halaman manual:sumber
du
yang tidak mendukungnya. The--threshold
pilihan yang ditambahkan di coreutils 8.21, dirilis pada tahun 2013 .Oke, jika Anda menggunakan Mac, lakukan ini:
stat -f %z "/Users/Example/config.log"
Itu dia!sumber