如何检查文件的大小?

时间:2011-05-07 09:55:41

标签: bash

我有一个检查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. " 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

14 个答案:

答案 0 :(得分:228)

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

答案 1 :(得分:21)

让我感到惊讶的是,没有人提到stat来检查文件大小。有些方法肯定更好:使用-s来查找文件是否为空是比其他任何方法都容易,如果你想要的话。如果你想找到大小的文件,那么find肯定是要走的路。

我也非常喜欢du以kb获取文件大小,但是,对于字节,我使用stat

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

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

答案 2 :(得分:15)

使用awk和双括号的替代解决方案:

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

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

答案 3 :(得分:10)

如果您的find处理此语法,则可以使用它:

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

当且仅当file.txt的大小小于90k时,才会将file.txt输出到stdout。如果script的大小小于90k,则执行脚本file.txt

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

答案 4 :(得分:8)

如果您只查找文件大小:

$ cat $file | wc -c
> 203233

答案 5 :(得分:6)

这适用于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
}

答案 6 :(得分: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选项,并且BLOCKSIZE = 1技巧不起作用(“最小块大小为512”,这会导致错误的结果)

  • cut -d' ' -f1不起作用,因为在Mac上,数字可能是右对齐的,在前面填充空格。

因此,如果您需要灵活的内容,可以是perl的{​​{1}}运算符,也可以-s通过管道传递给wc -c(awk会忽略前导空格)。< / p>

当然,关于原始问题的其余部分,请使用awk '{print $1}'(或-lt)运算符:

-gt等。

答案 7 :(得分:4)

python -c 'import os; print (os.path.getsize("... filename ..."))'
便携式,各种python风格,避免了stat方言的变化

答案 8 :(得分:3)

stat 似乎使用最少的系统调用执行此操作:

$ 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

答案 9 :(得分:2)

根据gniourf_gniourf的回答,

find "file.txt" -size -90k
当且仅当file.txt的大小小于90K且

时,

才会将file.txt写入stdout

find "file.txt" -size -90k -exec command \;
如果command的大小小于90K,

将执行命令 file.txt 。 我在Linux上测试了这个。 来自find(1)

  

...以下(-H-L-P选项)的命令行参数被视为 文件或的名称要检查的目录,直到第一个以' - '开头的参数,...

(重点补充)。

答案 10 :(得分:1)

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

假设ls命令在第6列报告文件大小

答案 11 :(得分:0)

为此,我将使用du的{​​{1}}。不确定此选项在--threshold的所有版本中是否可用,但已在GNU版本中实现。

du(1)的手册中引用:

du

这是我的解决方案,将-t, --threshold=SIZE exclude entries smaller than SIZE if positive, or entries greater than SIZE if negative 用于OP的用例:

du --threshold=

这样做的好处是THRESHOLD=90k if [[ -z "$(du --threshold=${THRESHOLD} file.txt)" ]]; then mail -s "file.txt size is below ${THRESHOLD}, please fix. " myemail@gmail.com < /dev/null mv -f /root/tmp/file.txt /var/www/file.txt fi 可以采用已知格式接受该选项的参数-既可以像du10K中那样是人类,也可以根据自己的意愿进行调整-您无需手动在格式/单位之间进行转换,因为10MiB可以处理。

作为参考,这是手册页中对此du自变量的解释:

SIZE

答案 12 :(得分:0)

好的,如果您使用的是Mac,请执行以下操作: stat -f %z "/Users/Example/config.log" 就是这样!

答案 13 :(得分:-3)

在bash中

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

也可以。