Skip to content

Instantly share code, notes, and snippets.

@jesux
Created January 30, 2026 18:01
Show Gist options
  • Select an option

  • Save jesux/aff3767819e4eab271fb4be264300a72 to your computer and use it in GitHub Desktop.

Select an option

Save jesux/aff3767819e4eab271fb4be264300a72 to your computer and use it in GitHub Desktop.
Script for copying files in blocks, performing checksums on each part
#!/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