Eu estou tentando fazer duas funções no bash. Uma função que percorre o conteúdo de um diretório e faz um hash md5 para cada arquivo, armazenando-os em um arquivo de soma de verificação .md5 no mesmo diretório. A outra função para verificar esse arquivo de soma de verificação em relação ao conteúdo do diretório. Estou tentando manter o padrão de arquivo .md5 que, acredito, é o md5 hash seguido pelo nome do arquivo em uma linha para cada arquivo.
Requisitos: Eu só posso usar o comando digest para criar o hash; quais erros nos diretórios ...
Idealmente, posso supor que os arquivos de entrada para arquivar são n número de itens que não são de diretório. No entanto, eu quero ser capaz de verificar o resumo primeiro por erros. Mesmo se falhar por alguma razão desconhecida, posso fazer outra tentativa antes de sair do script inteiro com erros, ou pelo menos registrar a incapacidade de fazer um resumo para esse arquivo em particular e continuar.
Pergunta principal: Como posso verificar se um erro de condição verifica um comando e também armazena a saída em uma variável?
Atualização: Solução aqui
if ! digest -a md5 "$file" ; then ; fi
Eu tentei outras variantes, como piping para um arquivo temporário, obtendo a variável e, em seguida, removendo o arquivo temporário, mas isso era excessivo para essa tarefa. Eu também olhei para acessar o código de saída usando $? mas com base no que eu li no passado, eu não tenho certeza da solidariedade desta comunidade em relação ao seu uso, deixe-me saber o que você pensa.
Pergunta secundária: Existe uma maneira melhor de conseguir isso?
Abaixo estão minhas funções incompletas atuais. Obrigado!
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
Tags bash solaris checksum shell-script