如何检查文件的大小?

我有一个脚本,检查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 

[ -n file.txt ]不检查它的大小,它检查stringfile.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 

在这种情况下,这听起来就是你想要的。

但仅供参考,如果您想知道文件正在使用多less磁盘空间,则可以使用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和双括号的替代解决scheme:

 FILENAME=file.txt SIZE=$(du -sb $FILENAME | awk '{ print $1 }') if ((SIZE<90000)) ; then echo "less"; else echo "not less"; fi 

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

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

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

如果你find处理这个语法,你可以使用它:

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

这将输出file.txt到标准输出当且仅当file.txt的大小小于90k。 要执行脚本script如果file.txt的大小小于90k:

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

如果你正在寻找一个文件的大小:

 $ cat $file | wc -c > 203233 

这在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 } 

为了在Linux和Mac OS X(大概是其他BSD)中获得文件大小,没有太多的select,这里提出的大多数只能在一个系统上运行。

给定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上,该数字可能是右alignment的,前面填充空格。

所以如果你需要一些灵活的东西,它可能是perl-s操作符,或者是wc -c awk '{print $1}' (awk将忽略前导空格)。

当然,对于原始问题的其余部分,请使用-lt (或-gt )运算符:

if [ $size -lt $your_wanted_size ]; then if [ $size -lt $your_wanted_size ]; then

stat似乎用最less的系统调用来做到这一点:

 $ 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 
 python -c 'import os; print (os.path.getsize("... filename ..."))' 

便携式的,所有的python的味道,避免统计方言的变化

根据gniourf_gniourf的回答,

 find "file.txt" -size -90k 

file.txt写入stdout当且仅当file.txt的大小小于90K,并且

 find“file.txt”-size -90k -exec 命令 \; 

如果file.txt的大小小于90K,将执行命令command 。 我已经在Linux上testing过了。 从find(1)

…(- -H-L-P选项)之后的命令行参数被取为要检查的文件或目录的名称,直到以“ – ”开始的第一个参数,…

(强调加)。

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

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

在bash中

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

也会工作。