Сценарий Bash для вывода пути к палке флэш-памяти USB

ls только отображает его вывод в столбцах, когда он печатает к терминалу. Когда его вывод является файлом или каналом, ls печать один объект на строку.

Можно использовать опцию -C для печати в столбцах независимо от типа потока вывода но это лишит возможности (или по крайней мере, трудно) фильтровать вывод с grep.

Можно сказать ls проигнорировать файлы, имя которых начинается с цифры. Это - самый простой способ быть произведенным, который похож на вывод от ls /proc только без рабочих каталогов.

ls -I '[0-9]*'

С другой стороны, можно указать, какие записи Вы хотите перечислить.

(cd /proc && ls -d [!0-9]*)

Если Вы просто хотите записи и не заботитесь о презентации или цветах, используйте подстановочные знаки оболочки вместо ls. Вторая команда характерна для zsh.

(cd /proc && echo [!0-9]*)
echo /proc/[^0-9]*(:t)
3
12.03.2014, 04:08
4 ответа
[114304]После подключения USB-устройства Вы можете узнать, что было установлено, просто посмотрев на этот путь:

C:\> dir /B | findstr /R /C:"[mp]"
Пример[12148]С вышеуказанной информацией ваш сценарий мог просто посмотреть на эти записи, используя нечто вроде [114795]readlink[114796]:[12149]А затем, используя команду [114797]mount[114798], пройти назад, чтобы узнать, в какой каталог устройство было автоматически подключено: [12150]Эта информация может быть расширена до одного liner подобно этому:[12151]Получение идентификатора устройства[12152]Вы можете разобрать эту информацию на выходе из [114799]/dev/disk/by-id/usb*[114800], подобно этому:[12153]Кстати, эта информация представляет собой конкатенцию описания производителя USB + продукта. [12154]Вы также можете получить доступ к ней, как только вы установили, какое устройство ([114801]/dev/sd*[114802]) использует USB устройство, через UDEV:[12155]
5
27.01.2020, 21:13
[114370] Можно написать скрипт, чтобы пройти через /etc/mtab и посмотреть на смонтированные устройства, затем использовать udevadm, чтобы проверить, являются ли они USB-устройствами. В /etc/mtab включено как имя устройства в /dev, так и точка его монтирования. Таким образом, вы можете сделать что-то вроде:[12231](Вам нужно установить IFS в вашем скрипте так, чтобы mtab читался построчно, а не "word" за "word").[114373].
2
27.01.2020, 21:13
[115496] На моем рабочем столе без USB флэш-устройств: [12165]На моём ноутбуке с двумя:[12166]Это должно быть всё, что вам нужно.[12167]Так что некоторые другие также сказали мне, что некоторые системы семейства debian ещё не поддерживают возможность транспортировки. В таком случае попробуйте это: [12168]Вышеприведённая команда сначала запрашивает lsblk список текущих (только для родителей - так что только [115878]sda[115879], а не [115880]sda1[115881]) блочных устройств по имени и столбцу для флага [115882]съемного[115883]. Выход выглядит так: [12169] Съемными являются только устройства, помеченные флажком [115884]1[115885]. Таким образом, мы [115886] установили [115887] наши параметры позиционирования [115888]([115889] подоболочки [115890])[115891] на разделенное содержимое, что составляет два параметра на запись. [115892], в то время как[115893] имеем как минимум 2 параметра позиционирования, мы [115894][[115895] тестируем [115896]] $2[115897] для [115898]1[115899] съемного флага, [115900] &&[115901], и если есть, то запрашиваем [115902]udevadm[115903] системный менеджер устройств на всю информацию, которую он имеет о нашем первом позиционном параметре, или [115904]/dev/$1[115905]. Далее [115906]сдвигаем[115907] наши первые [115908]2[115909] позиционные параметры и начинаем со следующих двух. [12171]udevadm[115911] предоставляет много информации об устройствах, которые могут вас заинтересовать, но если вы действительно хотите сразу перейти к делу, вы можете добавить следующие [115912]|pipe[115913] к [115914]udevadm[115915] [115916]stdout[115917]:[12172]Это даст вам список только родительских /dev/$DEV съемных устройств USB-блока, которые в настоящее время присутствуют в системе в формате: [12173] Если на данный момент вас интересуют только точки монтирования смонтированных разделов из вышеприведённых родительских ссылок, то вы можете скатать их все вместе с [115918]findmnt[115919] вот так: [12174] Это должно дать вам такой список: [12175]
0
27.01.2020, 21:13

Вот подход, который я использую. Это происходит из:

https://unix.stackexchange.com/a/119782/15010
https://unix.stackexchange.com/a/60335/15010

export USBKEYS=($(
    for blk in $(lsblk -ndo name) ; do {
        udevadm info --query=all --name "/dev/$blk" |\
        grep -q ID_BUS=usb &&
            printf 'findmnt %s -no TARGET ;'\
                "/dev/$blk" /dev/"$blk"[0-9]
        } ; done 2>&- |. /dev/stdin 
))
echo "$USBKEYS"
export STICK
case ${#USBKEYS[@]} in
    0 ) echo "No USB stick found."; exit 0 ;;
    1 ) STICK=$USBKEYS; echo "STICK=$USBKEYS" ;;
    * ) NOTE: the code for this case is not included in the interest of brevity.
esac

Это также работает для меня. В основном это из https://unix.stackexchange.com/a/119260/15010

#!/bin/bash

while read mtabline
do
  device=`echo $mtabline | awk '{print $1}'`
  udevline=`udevadm info -q path -n $device 2>&1 |grep usb` 
  if [ $? == 0 ] ; then
    echo "$device"
  fi
done < /etc/mtab
0
27.01.2020, 21:13

Теги

Похожие вопросы