J'ai écrit un script qui formate la clé USB et y place des supports. Il aide les gens d'une bibliothèque à obtenir un tas de code HTML et de médias dessus pour parcourir les données historiques (version officielle).
Tous mes scripts font bien le travail (formatage, montage, copie, démontage, dites "au revoir"). Mais un point: comment savoir quel appareil dois-je parcourir.
Une seule condition: il y a encore MAXimum 1 clé USB branchée.
Il y a généralement 3 personnes par jour qui viennent brancher leur clé (USB!) Dans la machine (cela ressemble à une machine à sous pour carte de crédit).
Ma question Aidez-moi, je ne sais pas quoi faire pour dire mon script:
Hé, le seul périphérique USB est/dev/sdX1
Ou
Hé, pas de clé USB dans mes E/S.
Je vous remercie
Ubuntu a une commande soignée udisksctl
qui permet de rechercher des informations avec l'option info
sur un périphérique bloc spécifié avec le -b
drapeau.
Maintenant, si nous analysons la sortie de udiskctl
pour chaque périphérique de bloc de a à z, et recherchons la chaîne 'usb' dedans, nous pouvons être sûrs qu'il s'agit d'un périphérique USB.
Ci-dessous est un script qui fait exactement cela:
#!/bin/bash
FOUND=0
for var in {a..z}; do
udisksctl info -b /dev/sd$var 2>/dev/null | grep -q 'usb';
if [ $(echo $?) -eq 0 ]; then
echo " FOUND USB DEVICE /dev/sd$var ";
FOUND=1
fi
done
if [ $FOUND -eq 0 ]; then
echo "NO USB DEVICES FOUND"
fi
Nous avons là le drapeau FOUND
, qui sert juste à imprimer "AUCUN PÉRIPHÉRIQUE USB TROUVÉ" si ... eh bien ... si aucun périphérique USB n'est trouvé! Sinon, si nous trouvons au moins un périphérique USB, nous mettons ce drapeau à 1 et nous l'ignorons.
Voici un exemple de sortie avec deux ports USB branchés puis retirés:
CURRENT DIR:[/home/xieerqi]
$ ./bin/sh/findusb.sh
FOUND USB DEVICE /dev/sdb
FOUND USB DEVICE /dev/sdc
CURRENT DIR:[/home/xieerqi]
$ ./bin/sh/findusb.sh
NO USB DEVICES FOUND
N'hésitez pas à modifier ce script en fonction de vos besoins.
Utilisation de find
et awk
#!/bin/bash
# your code ...
# The name of your MAXimum 1 drive in /media/$USER
maximum1="MAXimum 1"
if [ -z "$(find /media/$USER/ -maxdepth 1 ! -path /media/$USER/ -type d |\
awk '! /'"$maximum1"'/')" ]
then
echo "Hey, the only USB device is $maximum1"
else
echo "Hey, no USB pendrive in my I/O."
fi
# your code ...
Exemple
% ls -laog /media/$USER
total 24
drwxr-x---+ 3 4096 Aug 20 15:16 .
drwxr-xr-x 5 4096 Aug 18 08:43 ..
drwxr-xr-x 8 16384 Jan 1 1970 STORE N GO
% maximum1="STORE N GO"; if [ -z "$(find /media/$USER/ -maxdepth 1 ! -path /media/$USER/ -type d | awk '! /'"$maximum1"'/')" ]; then echo "Hey, the only USB device is $maximum1"; else echo "Hey, no USB pendrive in my I/O."; fi
Hey, the only USB device is STORE N GO
% maximum1="NOT STORE N GO"; if [ -z "$(find /media/$USER/ -maxdepth 1 ! -path /media/$USER/ -type d | awk '! /'"$maximum1"'/')" ]; then echo "Hey, the only USB device is $maximum1"; else echo "Hey, no USB pendrive in my I/O."; fi
Hey, no USB pendrive in my I/O.