Hi folks!
Got an interesting BASH script for you this time. I regularly use a BASH script to clone a HDD using cp, and other than perhaps using "-v", I couldn't think of a way to give it a GUI. A little research and thought into it came up with the following result:
#!/bin/bash
SRC="/mnt"
TGT="/mnt2"
echo "Copying $SRC to $TGT"
[[ -w /tmp/fifo ]] && rm /tmp/fifo
mkfifo /tmp/fifo
exec 5/tmp/fifo
(cat <&5
if [ ! "$(ps aux | awk '{print $2}' | grep $CPPID)" ]; then
break
fi
sleep 10
done
5
First up, the script sets variables for the locations to copy from and to. These must be mounted volumes in this example, as we use df
to detect them. This wouldn't be too difficult to convert to use some other method of working out the size, such as du
, if you aren't using a mounted volume.
We then create a pipe called fifo in /tmp. This is how we will feed data to dialog
.
Now we connect file descriptor 5 to the pipe, to facilitate the connection to our ncurses dialog, then pipe FD 5 into the dialog
program, yet again forked into the background.
Next, we find the total size of the source partition, and set it to the variable $TOTAL.
Here we set the copy process off, and fork it into the background, so the script will jump through to the next section, which regularly updates our instance of dialog
.
Here's the interesting bit... We run a while true loop, which every 10 seconds, checks the cumulative size of the target partition ($COPIED), and compares it to $TOTAL by converting it to a percentage, using bc. This number is then fed into the pipe, which we have connected to dialog. Each loop, we also check to see if the copy process is still running, and if not, we break out of the loop.
To clean up, we close the file descriptor 5
n00b<