Bash에서 두 가지 기능을 만들려고합니다. 함수는 디렉터리의 내용을 반복하여 각 파일에 대한 md5 해시를 생성하고 이를 동일한 디렉터리의 .md5 체크섬 파일에 저장합니다. 또 다른 기능은 디렉토리 내용에 대해 체크섬 파일을 확인하는 데 사용됩니다. 나는 계속 노력하고있다.md5 파일 표준나는 그것이 md5 해시 뒤에 각 파일에 대한 한 줄의 파일 이름이 오는 것이라고 생각합니다.
요구 사항: 해시를 생성하려면 다이제스트 명령만 사용할 수 있습니다. 디렉토리에 무슨 문제가 있습니까?
이상적으로는 보관할 인바운드 파일이 디렉터리가 아닌 n개의 항목이라고 가정할 수 있습니다. 그래도 먼저 요약해서 오류를 확인할 수 있었으면 좋겠습니다. 알 수 없는 이유로 실패하더라도 오류로 인해 전체 스크립트를 종료하기 전에 다시 시도하거나 최소한 해당 특정 파일에 대해 다이제스트할 수 없음을 기록하고 계속할 수 있습니다.
주요 질문: 조건이 잘못된 경우 어떻게 명령을 확인하고 출력을 변수에 저장할 수 있습니까?
고쳐 쓰다:해결책은 여기에 있습니다
if ! digest -a md5 "$file" ; then ; fi
변수를 가져오기 위해 임시 파일로 파이핑한 다음 임시 파일을 삭제하는 등의 다른 변형을 시도했지만 이 작업에는 너무 과도한 것 같습니다. 또한 종료 코드에 액세스하기 위해 $?를 사용해 보았지만 과거에 읽은 내용에 따르면 커뮤니티가 이 코드 사용에 대해 얼마나 단합되어 있는지 잘 모르겠습니다. 귀하의 생각을 알려주십시오.
두 번째 질문: 이를 달성하는 더 좋은 방법이 있습니까?
다음은 현재 불완전한 기능입니다. 감사해요!
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