How to find usb mounting point and serial number in bash


I’d been figuring out a way to find the mount points and their serial numbers for USB attached to the machine. So I decided to write a bash script which should return the details for multiple USB devices in a pipe (|) separated format.

/media/E4BC-1A90 :  2008012411263424  |  /media/Transcend : 0008012411263424
|________________|__________________|
mount point           Serial Number

Lets do it…

JFYI, There are many commands available in Linux to find all the mounted devices on your computer but the one we are going to use is ‘df’ which basically reports file system disk space usage. Here is what you get after running the command in Terminal.

amit@codef0rmer:/var/www/side-projects/usbsData$ df
Filesystem           1K-blocks      Used                 Available           Use%         Mounted on
/dev/sda1            49213248       18053208         28660100           39%            /
udev                   1001524         4                     1001520            1%              /dev
tmpfs                 404564            992                 403572              1%              /run
none                  5120               0                     5120                  0%             /run/lock
none                  1011404         2592                1008812             1%             /run/shm
/dev/sda6           185319436      38757044         137148660         23%            /home

/dev/sdb1           2058296          4                     2058292            1%             /media/E4BC-1A90

Now we’ll have to parse the output of the above command to extract only external devices mounted which IMO, mount into /media/ directory always, and store the locations into an array for further use.

# Fetching usbs location and putting them in array
locIterator="0"
locArr=()
while read row
do
   loc=$( echo $row | grep -P '/media/.*?$' -o )
   if [ "$loc" != "" ]; then
      locArr[ $locIterator ]="$loc"
      (( locIterator++ ))
   fi
done < <(df)

There are many commands to fetch the serial number and other details of the devices as well but I found this command suitable in this case. Here we are concatenating the content of multiple files generated after mounting the external devices using ‘cat /proc/scsi/usb-storage/*’ command.

# Fetching usbs serial numbers and putting them in array
snIterator="0"
snArr=()
while read row
do
   sn=$( echo $row | grep -P 'Serial Number:.*?$' -o )
   if [ "$sn" != "" ]; then
      snArr[ $snIterator ]="${sn:15}"
     (( snIterator++ ))
   fi
done < <(cat /proc/scsi/usb-storage/*)

Finally, we are going to loop through the first array and merge its elements with that of the second array, so we’ll get the desire output (see the starting of the blog post).

# Generating Output by looping through the both arrays
output=""
for (( i = 0 ; i < ${#locArr[@]} ; i++ ))
do
   if [ "$i" != "0"  ]; then 
      output="$output|"
   fi
   output="$output${locArr[$i]}: ${snArr[$i]}"
done
echo $output

Voila!

Run the script in a terminal `$ bash ./usb.sh`, please do not use `sh` instead of bash as you may get some belligerent errors 😉  and of course you can download the code from github.

Last but not the least, there are many ways to achieve the same thing and no program is 100% perfect so feel free to comment If you think we can make this bash script better. Good night! |-)

/media/E4BC-1A90: 2008012411263424
Advertisements

7 thoughts on “How to find usb mounting point and serial number in bash

  1. it says
    ./val.sh: line 9:syntax error near unexpected token ‘then’
    ./val.sh:line9 if [“$loc” != ” “]; then’

    can you please explain it to me asap. It would be great if i noe how to do this.

  2. i tried several time. I don’t know what is wrong. can you provide another solution to print out USB serial number store in array please.Using /dev/sda1 or somthing like that. this is part of my project. so, i am stuck here.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s