"Echo 1> / sys / block / sdX / device / delete" en todos los discos, excepto en la lista predeterminada

8

Tengo una lista de discos scsi que necesito eliminar. La lista se considera aleatoria en el mejor de los casos y cambia de vez en cuando. Quiero eliminar todo excepto una lista predefinida que he creado. Asumamos por ahora que solo quiero mantener:

/dev/sda
/dev/sdb

El comando que necesito ejecutar es:

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

Donde X es el dispositivo que se eliminará.

No soy bueno en bash scripting, así que realmente no sé por dónde empezar.

Para recapitular, así no recibo DV'd por no ser claro.

Necesito "echo 1> / sys / block / sdX / device / delete" para cada dispositivo sdX en el sistema, excepto para una lista predeterminada.

EDITAR: Después de la respuesta a continuación, esto es lo que he decidido usar. "LocalDisks.txt" debería contener líneas como "/ 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
fuente

Respuestas:

6

Aquí hay un enfoque que debería funcionar:

  • Obtenga la lista de sdXdispositivos para excluir

    exclude=$(cut -d/ -f3 exclude.txt)
  • Iterar sobre los /sys/block/sdXdirectorios:

    for sysfile in /sys/block/sd? ; do
  • Extraiga el sdXnombre de esa ruta y cree el deletenombre del archivo

      dev=$(basename $sysfile)
      del=$sysfile/device/delete
    
  • Compruebe si eso sdXestá en la lista de excluidos:

      if [[ $exclude == *$dev* ]] ; then
        echo "Device $dev excluded"
    
  • Compruebe si tiene los permisos de escritura adecuados en el archivo de eliminación

      elif [ ! -w $del ] ; then
        echo "$del does not exist or is not writable"
    
  • Haz la eliminación (no realmente)

      else
        echo "echo 1 > $del"
      fi
    
  • Ya terminaste!

    done
Estera
fuente
Creo que esto funcionará. Sin embargo, necesito hacer un ajuste. Tengo tantos discos que algunos son / dev / sdXX: si agrego un signo de interrogación al que ya tiene, solo devuelve / dev / sdXX y si solo hay un signo de interrogación, solo devuelve los que aparecen como / dev / sdX. Tiene sentido ... ¿Cómo puede servir a ambos?
LVLAaron
2
Reemplacé el? con un *
LVLAaron
Sí, eso era lo correcto para hacer allí. No había pensado en lo que sucede si tienes muchas unidades.
Mat
Técnicamente me diste exactamente lo que pedí, solo especifiqué una X. :)
LVLAaron