11-29-2014, 08:37 AM
I've been working on this for some time.
This script will calculate USB drive Storage Summary
it's convinient for the USB sticks
It will display what type of files you have on your drive/stick and their size in KB and KiB
Save it anywhere you like, make executable, insert your USB Flash drive or drives and wait until they get auto-mounted.
Then start the script.
This script will calculate USB drive Storage Summary
it's convinient for the USB sticks
It will display what type of files you have on your drive/stick and their size in KB and KiB
Save it anywhere you like, make executable, insert your USB Flash drive or drives and wait until they get auto-mounted.
Then start the script.
Code:
#!/bin/bash
# store the devices list
list=/tmp/devices
# get a list of devices
devs=`ls -al /dev/disk/by-path/*usb*part* 2>/dev/null | awk '{print($11)}'`
if [[ ${?} != 0 || -z ${devs} ]]
then
zenity --warning --text "No USB Mounted!"
exit
fi
# Check with user to make sure they mounted usb stick, no use wasting time
zenity --question --title="REMEMBER" --text="Make sure your usb disk is mounted\nDo you want to continue?" --ok-label="Yes" || exit
# Initialize list and make sure it is empty
>$list
# Now get the info about our devices and put it in a list
for dev in $devs; do dev="${dev##*\/}";
echo "FALSE" >> $list;
echo -n "$dev" >> $list;
echo " " >> $list;
echo `cat /sys/block/${dev:0:3}/device/vendor 2>/dev/null` >> $list;
echo `cat /sys/block/${dev:0:3}/device/model 2>/dev/null` >> $list;
echo `lsblk 2>/dev/null | grep \`echo -E ${dev}\` |awk '{print($4)}' `B >> $list;
echo `lsblk 2>/dev/null | grep \`echo -E ${dev}\` |cut -c 38- ` >> $list;
echo `lsblk -o NAME,FSTYPE 2>/dev/null | grep \`echo -E ${dev}\`| awk '{print($2)}' ` >> $list;
echo `ls -l /dev/disk/by-uuid/ 2>/dev/null | grep \`echo -E ${dev}\`| awk '{print($9)}' ` >> $list;
done
# clear our array
devfs=()
# read in the array using a line tmp variable. This let's zenity see it line by line
while read -r line
do
devfs+=("$line")
done < /tmp/devices
#Display the main dialog
disktmp=$(zenity --list --text="Select your USB drive from the list and click OK to begin.\nThis will calculate what file types you have on the drive and how much space do they consume.\nThe speed of this process depends on the drive size and on the number of files." --radiolist --width=650 --height=350 --column="Pick" --column="Dev" --column="Vendor" --column="Model" --column="Size" --column="Mount" --column="FS" --column="UUID" "${devfs[@]}" --separator=":")
#Test for cancellation
if [[ ${?} != 0 || -z ${disktmp} ]]
then
exit 0
fi
# Extract device
disk=${disktmp:0:4}
# Start calculating file sizes and convert bytes to human readable
{
echo "#Please wait, this my take a while"
find "$(echo `lsblk 2>/dev/null | grep \`echo -E ${disk}\` |cut -c 38- `)" -type f -exec file -b '{}' \; -printf '%s\n' | awk -F , 'NR%2 {i=$1} NR%2==0 {a[i]+=$1} END {for (i in a) printf("%12u %s\n",a[i],i)}' | sed -e 's/^[ \t]*//' > ~/usbinform
echo "#Calculating File size"
awk '{print $1}' ~/usbinform | awk '{ sum=$1 ; hum[1024**3]="GiB";hum[1024**2]="MiB";hum[1024]="KiB"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } if (sum<1024) {printf sum" bytes\n";break } }}' > ~/usbinform1
awk '{print $1}' ~/usbinform | awk '{ sum=$1 ; hum[1000**3]="GB";hum[1000**2]="MB";hum[1000]="KB"; for (x=1000**3; x>=1000; x/=1000){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } if (sum<1000) {printf sum" bytes\n";break } }}' > ~/usbinform2
sed -i 's/\w*.//' ~/usbinform
} | zenity --progress --pulsate --auto-close || exit
# Display results
paste -d'\n' ~/usbinform2 ~/usbinform1 ~/usbinform|zenity --list --title="${disk}" --column="Size" --column="Size KiB" --column="Description" --width=800 --height=650 --ok-label="Save" --cancel-label="OK" --text="Drive ${disk} Storage Summary\n1KB=1000 bytes, 1KiB=1024 bytes"
#Test for cancellation
if [[ ${?} != 0 ]]
then
rm ~/usbinform
rm ~/usbinform1
rm ~/usbinform2
exit 0
fi
#Ask where to save our file
zNewData=$(paste -d'\t' ~/usbinform2 ~/usbinform1 ~/usbinform)
zSavePath=$(echo -n "$(zenity --file-selection --save --confirm-overwrite --filename="USBdrive_summary.txt" --title="Save USB drive info")")
#Test for cancellation
f [[ ${?} != 0 ]]
then
rm ~/usbinform
rm ~/usbinform1
rm ~/usbinform2
exit 0
fi
#save
echo -n "$zNewData" > "$zSavePath"
# Remove temp files
rm ~/usbinform
rm ~/usbinform1
rm ~/usbinform2
exit