2011-05-07 136 views
110

我有一個腳本來檢查0大小,但我認爲必須有一種更簡單的方法來檢查文件大小。即file.txt通常爲100k;如何使腳本檢查它是否小於90k(包括0),並使它做一個新的副本,因爲在這種情況下文件已損壞。如何檢查文件的大小?

我目前使用的是什麼..

if [ -n file.txt ] 
then 
echo "everything is good" 
else 
mail -s "file.txt size is zero, please fix. " [email protected] < /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 
+1

http://unix.stackexchange.com/q uestions/16640/how-can-i-get-the-size-of-a-bash-script – 2015-10-01 08:06:38

回答

193

[ -n file.txt ]沒有檢查它的大小,它會檢查該字符串file.txt是非零的長度,因此它總是會成功的。

如果你想說「大小不爲零」,你需要[ -s file.txt ]

要獲得文件的大小,你可以使用wc -c以字節爲單位,以獲得大小(文件長度):

file=file.txt 
minimumsize=90000 
actualsize=$(wc -c <"$file") 
if [ $actualsize -ge $minimumsize ]; then 
    echo size is over $minimumsize bytes 
else 
    echo size is under $minimumsize bytes 
fi 

在這種情況下,這聽起來像這就是你想要的。

但僅供參考,如果你想知道文件的多少磁盤空間使用,你可以使用du -k得到以千字節大小(使用的磁盤空間):如果你需要更多的控制權

file=file.txt 
minimumsize=90 
actualsize=$(du -k "$file" | cut -f 1) 
if [ $actualsize -ge $minimumsize ]; then 
    echo size is over $minimumsize kilobytes 
else 
    echo size is under $minimumsize kilobytes 
fi 

輸出格式,你也可以看看stat。在Linux上,您可以從stat -c '%s' file.txt開始,在BSD/Mac OS X上開始,如stat -f '%z' file.txt。使用awk和雙括號

+3

爲什麼'du -b「$ file」| cut -f 1'而不是'stat -c'%s'「$ file」'?或'stat --printf =「%s」「$ file」'? – mivk 2013-12-14 11:00:26

+1

僅僅因爲它更便攜。 BSD和Linux'stat'具有不同的標誌。 – Mikel 2013-12-16 16:40:48

+0

'du'解決方案的一個優點是它可以(和-s選項一起)用於目錄。 – 2014-02-19 16:12:18

14

替代解決方案:

FILENAME=file.txt 
SIZE=$(du -sb $FILENAME | awk '{ print $1 }') 

if ((SIZE<90000)) ; then 
    echo "less"; 
else 
    echo "not less"; 
fi 
+1

不錯,但不適用於OSX,'du'不支持'-b'。 (這可能是一種有意識的風格選擇,但只是提到替代方法:當引用變量時,可以省略'((...))'內的'$'前綴:'((SIZE <90000))' – mklement0 2014-05-14 22:23:03

+0

實際上它是一個來自以前用戶的編輯,他認爲省略'$' – fstab 2014-05-15 08:37:16

+1

@fstab是錯誤的,您可以使用'read'('bash'內部命令)省略'awk':'read SIZE _ <<< $ (du -sb「$ FILENAME」)' – Jdamian 2014-11-13 09:01:52

-2

在bash

if [ -s file.txt ]; then 
... 
fi 

將工作太。

+8

這是行不通的,因爲OP想知道大小是否小於90k。這隻會檢查大小是否大於0。 – 2014-02-19 16:14:49

10

如果您find處理此語法,您可以使用它:

find -maxdepth 1 -name "file.txt" -size -90k 

這將輸出file.txt到stdout,當且僅當file.txt大小比90K以下。要執行一個腳本script如果file.txt比90K更小的尺寸:

find -maxdepth 1 -name "file.txt" -size -90k -exec script \; 
+3

+1,但也爲了使它在OSX上工作,你需要一個明確的目標目錄參數,例如:'find。 -maxdepth 1 -name「file.txt」-size -90k' – mklement0 2014-05-14 22:17:25

4

對於Linux和Mac OS X的(可能其他BSD系統),獲取文件的大小,不會有太多的選擇,大多數的這裏提出的建議只適用於一個系統。

鑑於f=/path/to/your/file

什麼在Linux和Mac的的bash所做的工作:

size=$(perl -e 'print -s shift' "$f") 

size=$(wc -c "$f" | awk '{print $1}') 

其他的答案在Linux下正常工作,但不在Mac上:

  • du沒有在Mac的一個-b選項,塊大小= 1招不工作(「最低的塊大小是512」,從而導致錯誤的結果)

  • cut -d' ' -f1不起作用因爲在Mac上,數字可能是右對齊的,前面填充空格。

所以,如果你需要的東西靈活,它要麼perl-s運營商,或wc -c輸送到awk '{print $1}'(AWK會忽略前導空格)。

和當然,對於你原來的問題的其餘部分,使用-lt(或-gt)操作:

if [ $size -lt $your_wanted_size ]; then

+3

+1;如果你知道只會在_arithmetic_ context中使用大小(忽略前導空格),你可以簡化爲'size = $(wc -c <「$ f」)'(注意'<',導致'wc'只報告一個數字)。重新比較:如果((size mklement0 2014-05-14 22:13:10

15

我很驚訝,沒有人提到stat檢查文件的大小。有些方法肯定更好:使用-s來查明文件是否爲空或者比其他任何東西都容易,如果這就是你想要的。如果你想找到文件的大小,那麼find肯定是要走的路。

我也喜歡du很多獲得KB文件的大小,但是,對於字節,我會使用stat

size=$(stat -f%z $filename) # BSD stat 

size=$(stat -c%s $filename) # GNU stat? 
+2

'stat'是一個好主意,但是在CentOS上,這對我來說很有用:'size = $(stat -c%s $ filename)' – 2014-06-13 21:44:30

+0

GNU和BSD之間的區別是,不幸的是,缺乏吸引力。 :( – lapo 2017-10-29 19:35:39

8

如果你正在尋找一個文件只是大小:

$ cat $file | wc -c 
> 203233 
+1

這可能是最短可行的答案,但它可能也是最慢的。:) – SunSparc 2014-08-25 22:41:47

+2

是的,但肯定在經濟上更好:工程時間成本>計算時間成本 – BananaNeil 2014-09-07 20:48:27

+1

當然。只取決於你的需求。 – SunSparc 2014-09-08 19:34:41

6

此基礎上gniourf_gniourf的回答,0工作在兩個Linux和MacOS

function filesize 
{ 
    local file=$1 
    size=`stat -c%s $file 2>/dev/null` # linux 
    if [ $? -eq 0 ] 
    then 
     echo $size 
     return 0 
    fi 

    eval $(stat -s $file) # macos 
    if [ $? -eq 0 ] 
    then 
     echo $st_size 
     return 0 
    fi 

    return -1 
} 
1
find "file.txt" -size -90k 

將寫file.txt到stdout當且僅當的file.txt的大小小於90K,和

find "file.txt" -size -90k -exec command \;

將執行命令command如果file.txt具有大小小於90K。 我已經在Linux上測試過了。 從find(1)

...命令行參數以下(在-H-L-P選項)被視爲對文件或目錄名稱進行審查,達開頭的第一個參數' - ',...

(強調增加)。

3

統計出現帶有最少的系統調用來做到這一點:

$ set debian-live-8.2.0-amd64-xfce-desktop.iso 

$ strace stat --format %s $1 | wc 
    282 2795 27364 

$ strace wc --bytes $1 | wc 
    307 3063 29091 

$ strace du --bytes $1 | wc 
    437 4376 41955 

$ strace find $1 -printf %s | wc 
    604 6061 64793 
3
python -c 'import os; print (os.path.getsize("... filename ..."))' 

便攜,蟒蛇的所有口味,避免在統計方言變化

0
ls -l $file | awk '{print $6}' 

假設ls命令報告文件大小在列#6