条件付きコマンド+変数に格納されている場合Solaris Bashスクリプト?

条件付きコマンド+変数に格納されている場合Solaris Bashスクリプト?

Bashで2つの機能を作成しようとしています。関数はディレクトリの内容を繰り返し、各ファイルのmd5ハッシュを生成し、それを同じディレクトリの.md5チェックサムファイルに保存します。別の機能は、ディレクトリの内容のチェックサムファイルを確認するために使用されます。ずっと頑張っています.md5 ファイル標準私はそれがmd5ハッシュの後に各ファイルの1行のファイル名が来ると思います。

要件:ハッシュを生成するには、ダイジェストコマンドのみを使用できます。ディレクトリに何の問題がありますか?

理想的には、アーカイブするインバウンドファイルがディレクトリではなくn個のエントリであると仮定できます。それでも最初に要約してエラーを確認できたらと思います。不明な理由で失敗しても、エラーが原因でスクリプト全体を終了する前に再試行するか、少なくとも特定のファイルに対してダイジェストできなかったことを記録して続行できます。

主な質問:条件が正しくない場合は、コマンドを確認して出力を変数に保存できますか?

修正する:解決策はここにあります

if ! digest -a md5 "$file" ; then ; fi

変数をインポートするために一時ファイルにパイピングしてから一時ファイルを削除するなどの他のバリエーションを試しましたが、これはあまりにも過度のようです。また、終了コードにアクセスするために$?を使用してみましたが、過去に読んだことによれば、コミュニティがこのコードの使用についてどれだけ統合されているのかわかりません。あなたの考えを教えてください。

2番目の質問:これを達成するためのより良い方法はありますか?

以下は現在不完全な機能です。ありがとうございます!

function make_directory_md5 () {
    local md5_file=$"$1/$(basename $1).md5"
    local attempts=$(($2 - 1))
    if [ ! -f "$md5_file" ] ; then
        if ! touch "$md5_file" >> "$file_log" ; then
            warning_handle "Could not make checksum file $md5_file, continuing anyway..."
            if [ "$verbose_mode" = true ]; then verbose_handle "Checksum file $md5_file process failed." ; fi
        else
            if [ "$verbose_mode" = true ]; then verbose_handle "Checksum file $md5_file created..." ; fi
            #Loop through file contents and get md5 and filename and output to checksum file
            for file in "$1/*" ; do
                if [ ! -d "$file" ] ; then
                    if [ ! "$file" = "$md5_file" ] ; then #Skip md5 file.
                        if ! hash="$(digest -a md5 $file)" >> "$file_log"  ; then
                            warning_handle "Problem occured when attempting to digest $file"
                            if [ "$verbose_mode" = true ]; then verbose_handle "Attempting to try again, attempts left: $attempts" ; fi
                            if [ $attempts -ge 1 ]; then
                                make_directory_md5 $1 $attempts
                            else
                                warning_handle "Attempt to create checksum file $md5_file FAILED out of attempts."
                                local sucess=false
                                if ! rm "$md5_file" >> "$file_log" ; then
                                    if [ -f "$md5_file" ] ; then
                                        warning_handle "Could not remove $md5_file and it still exists!"
                                    fi
                                else
                                    if [ "$verbose_mode" = true ]; then verbose_handle "Removed $md5_file" ; fi
                                fi
                            fi
                        else
                            echo "$hash $file" >> "$md5_file"
                        fi
                    fi
                else
                    warning_handle "Cannot hash directory! Skipping $file"
                    #Recursive decent into new directory. Or assume no directories ever...
                fi
            done
        fi
    else
        warning_handle "Attempted to create checksum file $md5_file but it already exists..."
        if [ "$verbose_mode" = true ]; then verbose_handle "Attempting to remove $md5_file..." ; fi
        if ! rm "$md5_file" >> "$file_log" ; then
            if [ -f "$md5_file" ] ; then
                warning_handle "Could not remove $md5_file and it still exists. Continuing with backup..."
                if [ "$verbose_mode" = true ]; then verbose_handle "Checksum file $md5_file process failed." ; fi
            else
                if [ "$verbose_mode" = true ]; then verbose_handle "Old checksum file $md5_file removed..." ; fi
                if [ "$verbose_mode" = true ]; then verbose_handle "Attempting to try again, attempts left: $attempts" ; fi
                if [ $attempts -ge 1 ] ; then
                    make_directory_md5 $1 $attempts
                else
                    local sucess=false
                    warning_handle "Attempt to create checksum file $md5_file FAILED out of attempts."
                    if [ "$verbose_mode" = true ]; then verbose_handle "Checksum file $md5_file process failed." ; fi
                fi
            fi
        else
            if [ "$verbose_mode" = true ]; then verbose_handle "Old checksum file $md5_file removed..." ; fi
            if [ "$verbose_mode" = true ]; then verbose_handle "Attempting to try again, attempts left: $attempts" ; fi
            if [ $attempts -ge 1 ] ; then
                make_directory_md5 $1 $attempts
            else
                local sucess=false
                warning_handle "Attempt to create checksum file $md5_file FAILED out of attempts."
                if [ "$verbose_mode" = true ]; then verbose_handle "Checksum file $md5_file process failed." ; fi
            fi
        fi
    fi
}

function check_directory_md5 () {
    local md5_file=$"$1/$1.md5"
    for file in "$1"/. ; do
        echo "$file"
    done
}

make_directory_md5 "/home/jsharpe/out" 3

ベストアンサー1

おすすめ記事