如何检查文件的大小?

use*_*418 132 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
Run Code Online (Sandbox Code Playgroud)

Mik*_*kel 233

[ -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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,听起来就像你想要的那样.

但是,仅供参考,如果您想知道文件使用了多少磁盘空间,您可以使用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
Run Code Online (Sandbox Code Playgroud)

如果您需要更多控制输出格式,您还可以查看stat.在Linux上,你会从像stat -c '%s' file.txtBSD/Mac OS X这样的东西开始stat -f '%z' file.txt.

  • 使用`wc -c <"$ file"`(注意`<`),在这种情况下你不需要`| cut ...`part(发布后,在OSX上不起作用).OSX上`du`的最小`BLOCKSIZE`值是'512`. (7认同)
  • 为什么`du -b"$ file"| cut -f 1`而不是`stat -c'%s'"$ file"`?或者`stat --printf ="%s""$ file"`? (5认同)
  • @PetriSirkkala在我的Linux系统上,`wc -c <filename`也使用`fstat`和`seek`?请注意,`fstat`采用fd,而不是路径名. (3认同)
  • 只是因为它更便携。BSD 和 Linux `stat` 有不同的标志。 (2认同)
  • Mac OS不能`du -b` (2认同)
  • 读取文件以确定其大小是否效率低下?我认为 stat 不会读取文件来查看它的大小。 (2认同)
  • 似乎`wc -c`使用了优化方法[fstat和seek](https://unix.stackexchange.com/questions/16640/how-can-i-get-the-size-of-a-file- in-a-bash-script#comment634607_16668)来确定文件大小,但这显然仅在给定一个要工作的文件而不是流时才有效。因此,为了避免对 wc 输出进行剪切操作,将读取整个文件以了解其大小。 (2认同)

Dan*_*ral 22

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

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

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

size=$(stat -c%s $filename) # GNU stat?
Run Code Online (Sandbox Code Playgroud)

  • `stat`是一个好主意,但在CentOS上这对我有用:`size = $(stat -c%s $ filename)` (2认同)
  • 不幸的是,GNU 和 BSD 之间的区别使得这种替代方案的吸引力稍显不足。:( (2认同)

fst*_*tab 16

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

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

if ((SIZE<90000)) ; then 
    echo "less"; 
else 
    echo "not less"; 
fi
Run Code Online (Sandbox Code Playgroud)

  • @fstab,您可以使用`read`(bash`内部命令)省略`awk`:`read SIZE _ &lt;&lt;&lt; $(du -sb“ $ FILENAME”)` (2认同)

gni*_*urf 11

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

find -maxdepth 1 -name "file.txt" -size -90k
Run Code Online (Sandbox Code Playgroud)

file.txt当且仅当大小file.txt小于90k时,这将输出到stdout .要执行一个脚本script,如果file.txt具有比90K以下的尺寸:

find -maxdepth 1 -name "file.txt" -size -90k -exec script \;
Run Code Online (Sandbox Code Playgroud)

  • +1,但为了使它在OSX上运行,你需要一个明确的目标目录参数,例如:`find.-maxdepth 1 -name"file.txt"-size -90k` (3认同)

Ban*_*eil 8

如果您只是寻找文件的大小:

$ cat $file | wc -c
> 203233
Run Code Online (Sandbox Code Playgroud)

  • `wc -c"$ file"`在2011年(三年前)给出了答案.是的,`wc -c"$ file"`有输出文件名和字符数的问题,所以早期答案添加了一个命令来分离计数.但是`WC -c <"$文件"`,它解决了问题,被添加为2014年5月评论你的回答是相当于,除了它增加了一个["无用使用`cat`"(HTTP: //superuser.com/q/323060/354511).此外,除非有充分的理由,否则应引用所有shell变量引用. (6认同)
  • 这可能是最短的可行答案,但也可能是最慢的。:) (2认同)
  • 是的,但肯定在经济上优越:工程时间成本>计算时间成本 (2认同)
  • 您可以通过使用 head -c 而不是 cat.if [ $(head -c 90000 $file | wc -c) -lt 90000 ] 来提高效率。然后 echo "文件小于 90k" ; fi 。在 CentOS 上进行了测试,因此它可能在 BSD 或 OSX 上工作,也可能不工作。 (2认同)

小智 7

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
Run Code Online (Sandbox Code Playgroud)


Nei*_*ill 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
}
Run Code Online (Sandbox Code Playgroud)


小智 6

python -c 'import os; print (os.path.getsize("... filename ..."))'
Run Code Online (Sandbox Code Playgroud)

可移植的,所有风格的python,避免统计方言的变化