1

仍在学习 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 的 txt 文件中。我做了一些研究,有些人要么建议使用du -b,要么stat -c '%s'但我看不出使用其中一种的利弊。打印文件会在 if else 之后出现还是留在 if 因为我为每个文件打印?我需要在同一行打印名称和结果。回显文件的最佳方法是什么?

4

2 回答 2

2

stat -c '%s'只会给你文件大小而不是别的,同时du -b会在输出中包含文件名,所以你必须使用例如cutawk只获取文件大小。对于您的要求,我会选择stat.

于 2012-09-13T18:56:13.323 回答
1

根据您的问题和您对以下问题的评论,我假设您想要做的是:

  1. 遍历特定目录中的所有 *.jpg 文件
  2. 根据图像的大小运行不同的命令
    • 具体来说,如果文件大小为 40318 字节,则要打印“[filename] 不存在” 。

如果我的假设很接近,那么这应该让你开始:

# 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 字符串操作,后者通过调用basename.

于 2012-09-17T09:08:35.120 回答