"echo 1 > /sys/block/sdX/device/delete" on all disks except predetermined list

18,149

Here's an approach that should work:

  • Get the list of sdX devices to exclude

    exclude=$(cut -d/ -f3 exclude.txt)
    
  • Iterate over the /sys/block/sdX directories:

    for sysfile in /sys/block/sd? ; do
    
  • Extract the sdX name from that path, and build the delete file name

      dev=$(basename $sysfile)
      del=$sysfile/device/delete
    
  • Check if that sdX is in the excluded list:

      if [[ $exclude == *$dev* ]] ; then
        echo "Device $dev excluded"
    
  • Check if you have appropriate write permissions on the delete file

      elif [ ! -w $del ] ; then
        echo "$del does not exist or is not writable"
    
  • Do the delete (not really)

      else
        echo "echo 1 > $del"
      fi
    
  • You're done!

    done
    
Share:
18,149

Related videos on Youtube

LVLAaron
Author by

LVLAaron

Updated on September 18, 2022

Comments

  • LVLAaron
    LVLAaron over 1 year

    I have a list of scsi disks that I need to remove. The list is considered random at best and changes from time to time. I want to remove everything except a predefined list that I have created. Let's assume for now that I only want to keep:

    /dev/sda
    /dev/sdb
    

    The command I need to execute is:

    "echo 1 > /sys/block/sdX/device/delete"
    

    Where X is the device to be removed.

    I'm not good at bash scripting so I don't really know where to start.

    To recap so I don't get DV'd for not being clear.

    I need to "echo 1 > /sys/block/sdX/device/delete" for every sdX device on the system except for a predetermined list.

    EDIT: After the answer below, this is what I've decided to use. "LocalDisks.txt" should contain lines like "/dev/sda"

    #!/bin/bash
    exclude=$(cut -d/ -f3 LocalDisks.txt)
    
    for sysfile in /sys/block/sd* ; do
    
    dev=$(basename $sysfile)
    del=$sysfile/device/delete
    
    if [[ $exclude == *$dev* ]] ; then
        echo "Device $dev excluded"
    
    elif [ ! -w $del ] ; then
        echo "$del does not exist or is not writable"
    
    else
        echo 1 > $del
    fi
    
    done
    
  • LVLAaron
    LVLAaron over 12 years
    I do think that this will work out. However, I need to make one adjustment. I have so many disks that some are /dev/sdXX - if I add a question mark to the one you already have it only returns the /dev/sdXX and if there's only one question mark, it only returns the ones like /dev/sdX. Makes sense... How can it service both?
  • LVLAaron
    LVLAaron over 12 years
    I replaced the ? with a *
  • Mat
    Mat over 12 years
    Yep, that was the right thing to do there. I hadn't thought about what happens if you have a lot of drives.
  • LVLAaron
    LVLAaron over 12 years
    Technically you gave me exactly what I asked for, I only specified one X. :)