Created
January 30, 2026 18:01
-
-
Save jesux/aff3767819e4eab271fb4be264300a72 to your computer and use it in GitHub Desktop.
Script for copying files in blocks, performing checksums on each part
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| INFILE=$1 | |
| OUTFILE=$2 | |
| SIZE="1M" #Linux | |
| #SIZE="1m" #OSX | |
| if [ -z "$2" ]; then | |
| echo "Usage: $0 INFILE OUTFILE [INIT] [END]" | |
| exit 1 | |
| fi | |
| if [ ! -f "${INFILE}" ]; then | |
| echo "Error: INFILE not found" | |
| fi | |
| if [ ! -f "${OUTFILE}" ]; then | |
| cp -v "${INFILE}" "${OUTFILE}" | |
| RESULT=$(diff -q <(sha256sum "${INFILE}" | awk '{print $1}') <(sha256sum "${OUTFILE}" | awk '{print $1}')) | |
| if [ -z "${RESULT}" ]; then | |
| echo "[+] COPY OK" | |
| exit 0 | |
| else | |
| echo "[-] CHECKSUM FAIL" | |
| fi | |
| fi | |
| if [ -z "$3" ]; then | |
| INIT=0 | |
| else | |
| INIT=$3 | |
| fi | |
| if [ -z "$4" ]; then | |
| END=$(du --block-size=${SIZE} "${INFILE}" | awk '{print $1}') #LINUX | |
| #END=$(du -m "${INFILE}" | awk '{print $1}') #OSX | |
| END=$(($END - 1)) | |
| else | |
| END=$4 | |
| fi | |
| INFILESIZE=$(du -ms "${INFILE}" | awk '{print $1}') | |
| OUTFILESIZE=$(du -ms "${OUTFILE}" | awk '{print $1}') | |
| if [ "${INFILESIZE}" != "${OUTFILESIZE}" ]; then | |
| echo "Error: FILES SIZE ${INFILESIZE}!=${OUTFILESIZE}" | |
| exit 1 | |
| fi | |
| echo "== COPY AND CHECK ===" | |
| echo "INFILE: ${INFILE}" | |
| echo "OUTFILE: ${OUTFILE}" | |
| echo "INIT: ${INIT} - END: ${END}" | |
| sleep 2 | |
| BADBLOCKS=0 | |
| for N in $(seq ${INIT} ${END}); do | |
| RESULT=$(diff -q <(dd if="${INFILE}" bs=${SIZE} skip=${N} count=1 2>/dev/null | xxd -a) <(dd if="${OUTFILE}" bs=${SIZE} skip=${N} count=1 2>/dev/null | xxd -a)) | |
| if [ -z "${RESULT}" ]; then | |
| echo -en "\r$N OK" | |
| else | |
| BADBLOCKS=$((BADBLOCKS + 1)) | |
| while [ -n "${RESULT}" ]; do | |
| echo -e "\r$N DIFF" | |
| dd if="${INFILE}" of="${OUTFILE}" bs=${SIZE} skip=${N} seek=${N} count=1 conv=notrunc status=none | |
| sleep 0.1 | |
| RESULT=$(diff -q <(dd if="${INFILE}" bs=${SIZE} skip=${N} count=1 2>/dev/null | xxd -a) <(dd if="${OUTFILE}" bs=${SIZE} skip=${N} count=1 2>/dev/null | xxd -a)) | |
| done | |
| echo -en "\r$N OK" | |
| fi | |
| done | |
| echo -e "\n[+] Finished" | |
| echo "Total bad blocks: ${BADBLOCKS}" | |
| sha256sum "${INFILE}" "${OUTFILE}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment