如何检查文件的大小?
我有一个脚本,检查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
也会工作。