«Echo 1> / sys / block / sdX / device / delete» sur tous les disques sauf la liste prédéterminée

8

J'ai une liste de disques scsi que je dois retirer. La liste est considérée au mieux comme aléatoire et change de temps en temps. Je veux tout supprimer sauf une liste prédéfinie que j'ai créée. Supposons pour l'instant que je veux seulement garder:

/dev/sda
/dev/sdb

La commande que je dois exécuter est:

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

Où X est le périphérique à supprimer.

Je ne suis pas bon en script bash donc je ne sais pas vraiment par où commencer.

Pour récapituler, je ne reçois pas DV'd pour ne pas être clair.

J'ai besoin de "echo 1> / sys / block / sdX / device / delete" pour chaque périphérique sdX sur le système à l'exception d'une liste prédéterminée.

EDIT: Après la réponse ci-dessous, c'est ce que j'ai décidé d'utiliser. "LocalDisks.txt" devrait contenir des lignes comme "/ 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
la source

Réponses:

6

Voici une approche qui devrait fonctionner:

  • Obtenez la liste des sdXappareils à exclure

    exclude=$(cut -d/ -f3 exclude.txt)
  • Parcourez les /sys/block/sdXrépertoires:

    for sysfile in /sys/block/sd? ; do
  • Extraire le sdXnom de ce chemin et créer le deletenom du fichier

      dev=$(basename $sysfile)
      del=$sysfile/device/delete
  • Vérifiez si cela sdXfigure dans la liste des exclus:

      if [[ $exclude == *$dev* ]] ; then
        echo "Device $dev excluded"
  • Vérifiez si vous disposez des autorisations d'écriture appropriées sur le fichier de suppression

      elif [ ! -w $del ] ; then
        echo "$del does not exist or is not writable"
  • Faites l'effacement (pas vraiment)

      else
        echo "echo 1 > $del"
      fi
  • Vous avez terminé!

    done
Tapis
la source
Je pense que cela fonctionnera. Cependant, je dois faire un ajustement. J'ai tellement de disques que certains sont / dev / sdXX - si j'ajoute un point d'interrogation à celui que vous avez déjà, il ne renvoie que le / dev / sdXX et s'il n'y a qu'un seul point d'interrogation, il ne renvoie que ceux comme / dev / sdX. Cela a du sens ... Comment peut-il servir les deux?
LVLAaron
2
J'ai remplacé le? avec un *
LVLAaron
Oui, c'était la bonne chose à faire là-bas. Je n'avais pas pensé à ce qui se passe si vous avez beaucoup de lecteurs.
Mat
Techniquement, vous m'avez donné exactement ce que j'ai demandé, je n'ai spécifié qu'un seul X. :)
LVLAaron