如何在Bash中检查文件的大小是否大于某个值

bip*_*ter 9 bash shell

好的,初学者:
我如何实现以下目标:

  • 我需要检查一个文件的大小
  • 然后使用if条件和相应的条件语句将此文件大小与固定数字进行比较

到目前为止,我有以下内容:

#!/bin/bash

# File to consider
FILENAME=./testfile.txt

# MAXSIZE is 5 MB
MAXSIZE = 500000

# Get file size
FILESIZE=$(stat -c%s "$FILENAME")
# Checkpoint
echo "Size of $FILENAME = $FILESIZE bytes."

# The following doesn't work
if [ (( $FILESIZE > MAXSIZE)) ]; then
    echo "nope"
else
    echo "fine"
fi
Run Code Online (Sandbox Code Playgroud)

使用此代码,我可以在变量$ FILESIZE中获取文件名,但我无法将其与固定的整数值进行比较.

编辑

#!/bin/bash
filename=./testfile.txt
maxsize=5
filesize=$(stat -c%s "$filename")
echo "Size of $filename = $filesize bytes."

if (( filesize > maxsize )); then
    echo "nope"
else
    echo "fine"
fi
Run Code Online (Sandbox Code Playgroud)

Ini*_*ian 13

几个句法问题.

  1. 变量定义中bash没有空格MAXSIZE=500000,不应该有空格
  2. 比较操作的方式是不正确的.而不是if [ (( $FILESIZE > MAXSIZE)) ];.你很可能使用bash单独的自己的算术运算符和跳过[运营商只if (( FILESIZE > MAXSIZE)); then

如果您担心脚本中的语法问题,请使用shellcheck语法检查脚本并修复从中看到的错误.


作为一般的编码实践小写用户定义的变量中bash,以避免与它们由shell解释用于不同目的的特殊环境变量混淆它们(例如$HOME,$SHELL)


小智 6

find您也可以使用该命令来完成此操作。请参阅以下示例。

您可以将stat命令更改为您需要的任何命令。

ls -lh test.txt

-rw-r--r-- 1 root root 25M Jan 20 19:36 test.txt


find ~/test.txt -size 25M -exec stat '{}' \;

  File: '/root/test.txt'
  Size: 26214400        Blocks: 51200      IO Block: 4096   regular file
Device: fe04h/65028d    Inode: 402704      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-01-20 19:36:51.222371293 +0000
Modify: 2022-01-20 19:36:51.242373113 +0000
Change: 2022-01-20 19:36:51.242373113 +0000
 Birth: -
Run Code Online (Sandbox Code Playgroud)

如果文件的大小不符合您要查找的大小,则它不会执行任何操作。

find ~/test.txt -size 99M -exec true \;
Run Code Online (Sandbox Code Playgroud)