Автор Тема: Путь к USB-накопителю в Lazarus [РЕШЕНО]  (Прочитано 6116 раз)

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 20 159
    • Домашняя страница
Re: Путь к USB-накопителю в Lazarus
« Ответ #15 : 15.06.2014 07:59:45 »
Потому что shell-подстановку экранировать обратным слешем надо: \*. Но проще использовать подстановку напрямую в ls, как писали выше.
Андрей Черепанов (cas@)

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Путь к USB-накопителю в Lazarus
« Ответ #16 : 16.06.2014 03:23:57 »
Два дня назад выполнял команду для поиска подключенный USB:
У меня результатом выполнения данной команды является список файлов в домашнем каталоге. Но это при отсутствии в системе подключенных через усб накопителей. Если накопитель подключить, то в результате получаем наименование блочного устройства накопителя.

Оп-пачки... Точно. Слона-то я и не приметил:
- При отсутствии аргумента, который создаётся '$(find ... )', 'ls -l' возвратит содержимое текущего каталога.

Надо организовывать условие:
# cat ./retdevusb
#!/bin/bash
# Return USB-drive names

DEVUSB=
DEVUSB=$(find /dev/disk/by-id/ -name usb*)

# Check USB drives found
if [ "${#DEVUSB}" != 0 ]; then
    # USB drive found
    ls -l $(find /dev/disk/by-id/ -name usb*)|cut -d '>' -f2|sed 's/ ..\/../\/dev/'|grep -v sd[a-z][1-9]
# USB drive not found
else echo "Drives USB not found"
fi

Или совсем else "заглушить", чтобы при отсутствии USB-накопителя ничего не выдавало.
Т.е. при наличии USB-накопителя возвращает имя устройства, при отсутствии ничего не возвращает.

USB-носителя нет:
# ./retdevusb
Drives USB not found

USB-носитель вставлен в порт:
# time -f %e ./retdevusb
/dev/sdb
0.02

Но это же можно и однострочником:
# DEVUSB= && DEVUSB=$(find /dev/disk/by-id/ -name usb*) && \
if [ "${#DEVUSB}" != 0 ]; then \
ls -l $(find /dev/disk/by-id/ -name usb*)|cut -d '>' -f2|sed 's/ ..\/../\/dev/'|grep -v sd[a-z][1-9]; \
else echo "Drives USB not found"; fi
« Последнее редактирование: 16.06.2014 07:49:39 от Speccyfighter »

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 20 159
    • Домашняя страница
Re: Путь к USB-накопителю в Lazarus
« Ответ #17 : 16.06.2014 11:06:59 »
А что, накопители разве не на верхнем уровне by-id? Да и условие лишнее, можно обойтись пайпом и xargs.
Андрей Черепанов (cas@)

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Путь к USB-накопителю в Lazarus
« Ответ #18 : 16.06.2014 20:26:22 »
А что, накопители разве не на верхнем уровне by-id? Да и условие лишнее, можно обойтись пайпом и xargs.

Ничего лучшего пока не приходит в голову без условий:
# DEVUSB=$(find /dev/disk/by-id/ -name usb-*) && [ -z "$DEVUSB" ] || \
ls -l $DEVUSB|cut -d '>' -f2|sed 's/ ..\/../\/dev/'|grep -v sd[a-z][1-9]
Однострочник. Возвращает имя USB-накопителя (usb-flash/usb-hdd), если в наличии, или ничего не возвращает, если отсутствует.
Если $DEVUSB не нулевой длины, то 'ls -l bla-bla-bla' будет выполняться. И наоборот.
Хотя переменную лучше наверное всё-таки обозвать BLKUSB, поскольку поиск ведётся на наличие блочных USB-устройств, а не USB-устройств вообще. Суть этого комментария в том, что скрипт должен быть максимально понятным исключающим двусмыслие, поскольку он сам по себе может являться комментарием.
« Последнее редактирование: 17.06.2014 00:14:01 от Speccyfighter »

Оффлайн hago

  • Участник
  • *
  • Сообщений: 62
Re: Путь к USB-накопителю в Lazarus
« Ответ #19 : 16.06.2014 21:16:03 »
Speccyfighter, спасибо большое за подробный ответ!
Только у меня почему-то Ваши примеры работают, если в команде find указываю маску поиска usb-*, а не usb*.

Ещё хотел у Вас спросить, нет ли случайно не примете команды, которая выводит путь  usb-носителю, который был вставлен последним?

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Re: Путь к USB-накопителю в Lazarus
« Ответ #20 : 16.06.2014 23:16:12 »
Speccyfighter, спасибо большое за подробный ответ!
Только у меня почему-то Ваши примеры работают, если в команде find указываю маску поиска usb-*, а не usb*.

Странно... У меня этого не происходит. Но всё равно спасибо за замечание: последний скрипт поправил.

Ещё хотел у Вас спросить, нет ли случайно не примете команды, которая выводит путь  usb-носителю, который был вставлен последним?

Нет, у меня нет под руками, я ведь даже не шелл-кодер. Только об этом наверное никто не догадывается. :-)

Тем не менее, попробуйте это
# BLKUSB=$(find /dev/disk/by-id/ -name usb-*) && [ -z "$BLKUSB" ] || \
ls -lt --time-style=full-iso $BLKUSB|grep -v sd[a-z][1-9]|head -n 1|cut -d '>' -f2|sed 's/ ..\/../\/dev/'
/dev/sdb
В этом скрипте сменилось имя переменной с DEVUSB на BLKUSB, поскольку последнее выглядит более логично для выполняемой операции: поиск блочных USB-устройств, т.е накопителей.

Тут
# ls -lt --time-style=full-iso /dev/disk/by-id/|grep usb-|grep -v sd[a-z][1-9]
lrwxrwxrwx 1 root root  9 2014-06-16 21:27:46.196232331 +0300 usb-SEMC_Mass_Storage_BX902KNNSL-0:0 -> ../../sdb
lrwxrwxrwx 1 root root  9 2014-06-16 21:27:42.412213567 +0300 usb-Kingston_DT_101_II_001D0F0CAABFF980D5A00AAD-0:0 -> ../../sdc
соль в следующем:
Несмотря на то, что флешка Kingston была вставлена в usb-порт на несколько секунд позднее чем андроид SONY, SONY XPERIA Mini автоматически переключается в режим накопителя (на что требуется время), и переключилась SONY в режим накопителя на несколько секунд позднее, чем был создан файл устройства для флешки Kingston.
Стало быть и файл устройства для SONY XPERIA Mini был создан на несколько секунд позднее:
# ls -lt --time-style=full-iso /dev/|grep sd[b-c]|grep -v sd[a-z][1-9]
brw-rw---- 1 root   disk    8,  16 2014-06-16 21:27:46.196232331 +0300 sdb
brw-rw---- 1 root   disk    8,  32 2014-06-16 21:27:42.412213567 +0300 sdc
Поэтому командой выше было показано последнее подключённое устройство sdb, а не sdc, на уровне времени создания файла-устройства, а не порядка вставки в порт.

А здесь
# BLKUSB=$(find /dev/disk/by-id/ -name usb-*) && [ -z "$BLKUSB" ] || \
ls -lt --time-style=full-iso $BLKUSB|grep -v sd[a-z][1-9]|head -n 1|cut -d '>' -f2|sed 's/ ..\/../\/dev/'
/dev/sdc
# ls -lt --time-style=full-iso /dev/|grep sd[b-c]|grep -v sd[a-z][1-9]
brw-rw---- 1 root   disk    8,  32 2014-06-16 21:58:07.385263120 +0300 sdc
brw-rw---- 1 root   disk    8,  16 2014-06-16 21:58:04.449248561 +0300 sdb
# ls -lt --time-style=full-iso /dev/disk/by-id/|grep usb-|grep -v sd[a-z][1-9]
lrwxrwxrwx 1 root root  9 2014-06-16 21:58:07.385263120 +0300 usb-Kingston_DT_101_II_001D0F0CAABFF980D5A00AAD-0:0 -> ../../sdc
lrwxrwxrwx 1 root root  9 2014-06-16 21:58:04.449248561 +0300 usb-UFD_2.0_Silicon-Power8G_13010673022000000673-0:0 -> ../../sdb
последний подключённый usb-накопитель показан Kingston /dev/sdc, поскольку флешки подключаются быстро и без задержек.

В команде сортировки, которая используется в скрипте,
# ls -lt --time-style=full-iso /dev/sd[b-c]
brw-rw---- 1 root disk 8, 32 2014-06-16 21:58:07.385263120 +0300 /dev/sdc
brw-rw---- 1 root disk 8, 16 2014-06-16 21:58:04.449248561 +0300 /dev/sdb
новые файлы идут в выводе первыми в списке, от нового сверху, вниз списка к более старым.
Поэтому свежий легко захватить через 'head -n 1'.

И наоборот.
Добавление ключа '-r' (--reverse) позволит увидеть USB-накопитель подключённый первым:
# BLKUSB=$(find /dev/disk/by-id/ -name usb-*) && [ -z "$BLKUSB" ] || \
ls -lt --time-style=full-iso -r $BLKUSB|grep -v sd[a-z][1-9]|head -n 1|cut -d '>' -f2|sed 's/ ..\/../\/dev/'
/dev/sdb
# ls -lt --time-style=full-iso -r /dev/sd[b-c]
brw-rw---- 1 root disk 8, 16 2014-06-16 23:16:17.100518162 +0300 /dev/sdb
brw-rw---- 1 root disk 8, 32 2014-06-16 23:16:19.532530221 +0300 /dev/sdc

За гибкость утилиты ls спасибо дядьке Столлману и Дэвиду МакКензи.
« Последнее редактирование: 17.06.2014 01:17:18 от Speccyfighter »

Оффлайн hago

  • Участник
  • *
  • Сообщений: 62
Re: Путь к USB-накопителю в Lazarus
« Ответ #21 : 17.06.2014 15:01:05 »
Уважаемый, Speccyfighter, огромнейшее спасибо за подсказку:
# BLKUSB=$(find /dev/disk/by-id/ -name usb-*) && [ -z "$BLKUSB" ] || \
ls -lt --time-style=full-iso $BLKUSB|grep -v sd[a-z][1-9]|head -n 1|cut -d '>' -f2|sed 's/ ..\/../\/dev/'

Всё чётко работает!  :-)
Ни на одном форуме, такого подробного разъяснения не нашёл. А тут, с Вашей помощью, на все трудные (надеюсь, пока) вопросы получаю подробные ответы.

Так что дядькам Столлману и Дэвиду МакКензи спасибо, ну а Вам с меня пиво! ;-)