2012-09-13 107 views
0

還在學習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',但我看不出使用哪一種或哪一種的優缺點。將打印到文件後,如果其他或留在如果因爲我打印每個文件?我需要在同一行中打印名稱和結果。什麼是最好的方式來回顯文件?

回答

0

根據您的問題,並在your following question您的意見我假設你想要做的是:

  1. 迭代通過根據
  2. 運行不同的命令特定目錄下的所有* .jpg文件圖像
    • 的大小具體來說,要打印「[文件名]不存在」如果文件大小40318個字節。

如果我的假設是密切,那麼這應該讓你開始:

# 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

1

stat -c '%s'會給你的文件的大小,沒有別的,而du -b將包括在輸出文件名,所以你必須使用例如cutawk得到公正的文件大小。根據您的要求,我會去stat