2026-02-01 14:45:28 +02:00
|
|
|
#!/bin/sh
|
|
|
|
|
# Image Transfer: a simple script to transfer raw images to/from removable media
|
|
|
|
|
# in a safer manner
|
|
|
|
|
# Depends on basename, dd, fzf
|
|
|
|
|
# Usage: it.sh w|r image-file
|
|
|
|
|
# Created by Luxferre in 2026, released into public domain
|
|
|
|
|
|
2026-02-07 15:15:36 +02:00
|
|
|
get_removables() {
|
2026-02-01 14:45:28 +02:00
|
|
|
for ddir in /sys/block/*; do
|
|
|
|
|
if grep -q 1 ${ddir}/removable; then
|
|
|
|
|
dbase="$(basename $ddir)"
|
|
|
|
|
dvendor="$(cat ${ddir}/device/vendor)"
|
|
|
|
|
dmodel="$(cat ${ddir}/device/model)"
|
2026-02-02 13:26:47 +02:00
|
|
|
printf "%s\t%s %s\n" "$dbase" "$dvendor" "$dmodel"
|
2026-02-01 14:45:28 +02:00
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DEF_DD_OPTS="status=progress"
|
|
|
|
|
[ -z "$DD_OPTS" ] && DD_OPTS="bs=2M"
|
|
|
|
|
[ -z "$SUDO" ] && SUDO="sudo"
|
|
|
|
|
if [ -z "$1" ]; then
|
|
|
|
|
echo "No operation! Select w or r"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
if [ -z "$2" ]; then
|
|
|
|
|
echo "No target file specified!"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
2026-02-07 15:15:36 +02:00
|
|
|
TARGET_DRIVE="/dev/$(get_removables | fzf --prompt "Select the drive: " | cut -f 1)"
|
2026-02-01 14:45:28 +02:00
|
|
|
|
|
|
|
|
RUN_COMMAND=""
|
|
|
|
|
if [ "$1" = "w" ]; then
|
|
|
|
|
RUN_COMMAND="dd if=$2 of=$TARGET_DRIVE $DEF_DD_OPTS $DD_OPTS"
|
|
|
|
|
if [ ! -w $TARGET_DRIVE ]; then
|
|
|
|
|
RUN_COMMAND="$SUDO $RUN_COMMAND"
|
|
|
|
|
fi
|
|
|
|
|
elif [ "$1" = "r" ]; then
|
|
|
|
|
RUN_COMMAND="dd of=$2 if=$TARGET_DRIVE $DEF_DD_OPTS $DD_OPTS"
|
|
|
|
|
if [ ! -r $TARGET_DRIVE ]; then
|
|
|
|
|
RUN_COMMAND="$SUDO $RUN_COMMAND"
|
|
|
|
|
fi
|
|
|
|
|
else
|
|
|
|
|
echo "Invalid operation! Select w or r"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
echo "Starting the operation..."
|
|
|
|
|
$RUN_COMMAND && echo "Operation successful!" || echo "Operation completed with errors!"
|
|
|
|
|
|