我有一个检查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
答案 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
可以采用已知格式接受该选项的参数-既可以像du
,10K
中那样是人类,也可以根据自己的意愿进行调整-您无需手动在格式/单位之间进行转换,因为10MiB
可以处理。
作为参考,这是手册页中对此du
自变量的解释:
SIZE
答案 12 :(得分:0)
好的,如果您使用的是Mac,请执行以下操作:
stat -f %z "/Users/Example/config.log"
就是这样!
答案 13 :(得分:-3)
在bash中
if [ -s file.txt ]; then
...
fi
也可以。