还在学习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 -b
或stat -c '%s'
,但我看不出使用其中一种的利弊。打印到文件是否会在if else之后或者保留为if,因为Im打印每个文件?我需要在同一行打印名称和结果。回复文件的最佳方法是什么?
答案 0 :(得分:2)
stat -c '%s'
会为您提供文件大小而不提供任何其他内容,而du -b
将在输出中包含文件名,因此您必须使用例如cut
或{{ 1}}只获取文件大小。根据您的要求,我会选择awk
。
答案 1 :(得分:1)
根据您的问题以及您对your following question的评论,我假设您要做的是:
如果我的假设很接近,那么这应该让你开始:
# 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
来实现。