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 ファイルに各行を出力する必要があります。du -b一部の人々がorの使用を提案している場所を調査しましたが、どちらか一方を使用する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 バイトの場合、「[ファイル名] が存在しません」と出力します。

私の仮定が近い場合、これで始められるはずです:

# 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 に答える