Bash确定文件大小

时间:2012-09-13 18:49:13

标签: image bash

还在学习bash,但我对我的剧本有一些疑问。

我的脚本目标是访问带有jpg图像的文件夹,如果图像是34.9kb,它将返回不存在的文件。 34.9kb是显示“图像不存在”的图像大小。

#!/bin/bash

#Location
DIR="/mnt/windows/images"

file=file.jpg
badfile=12345
actualsize=$(du -b "$file" | cut -f 1)
if [ $actualsize -ge $badfile ]; then
    echo $file does not exist >> results.txt
else
    echo $file exists >> results.txt
fi

我需要它将每行打印到名为results的txt文件。我做过研究,有些人建议使用du -bstat -c '%s',但我看不出使用其中一种的利弊。打印到文件是否会在if else之后或者保留为if,因为Im打印每个文件?我需要在同一行打印名称和结果。回复文件的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

stat -c '%s'会为您提供文件大小而不提供任何其他内容,而du -b将在输出中包含文件名,因此您必须使用例如cut或{{ 1}}只获取文件大小。根据您的要求,我会选择awk

答案 1 :(得分:1)

根据您的问题以及您对your following question的评论,我假设您要做的是:

  1. 遍历特定目录中的所有* .jpg文件
  2. 根据图像的大小运行不同的命令
    • 具体来说,如果文件大小为40318字节,则要打印“[filename]不存在”
  3. 如果我的假设很接近,那么这应该让你开始:

    # Location
    DIR="/home/lsc"
    # Size to match
    BADSIZE=40318
    
    find "$DIR" -maxdepth 1 -name "*.jpg" | while read filename; do
        FILESIZE=$(stat -c "%s" "$filename")  # get file size
        if [ $FILESIZE -eq $BADSIZE ]; then
            echo "$filename has a size that matches BADSIZE"
        else
            echo "$filename is fine"
        fi
    done
    

    请注意,我使用了“find ... | while read filename”而不是“for filename in *.jpg”,因为前者可以更好地处理包含空格的路径。

    另请注意,$filename将包含文件的完整路径(例如/mnt/windows/images/pic.jpg)。如果只想打印没有路径的文件名,可以使用:

    echo ${filename##*/}
    

    或:

    echo $(basename $filename)
    

    第一个使用Bash string maniputation,效率更高但可读性更低,后者通过拨打basename来实现。