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