Существует несколько способов сказать без полномочий пользователя root, многих из них tricky/hacky:
Используя /dev/disk/by-id
:
find /dev/disk/by-id/ -lname '*sdX'
Если это отвечает чем-то как /dev/disk/by-id/usb-blah-blah-blah
, затем это - диск USB. Другие префиксы включают ata
, dm
, memstick
, scsi
, и т.д.
Используя /dev/disk/by-path
не существенно отличается:
find /dev/disk/by-path/ -lname '*sdX'
Вы получите что-то как /dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0
. Это показывает продвижение пути устройства диску. В этом случае грубым путем является PCI → USB → диск. (отметьте -usb-
).
Используя udev (я выполняю Debian. Мой udevadm
находится в /sbin
который не находится на моем $PATH
— Ваш мог бы быть в другом месте, на или от Вашего $PATH
):
/sbin/udevadm info --query=all --name=sdX | grep ID_BUS
Вы получите тип шины, устройство работает. Удалите | grep ID_BUS
для полного списка информации (Вы, возможно, должны добавить |less
).
Если Вы имеете lshw
установленный, ответ Huygens' может также работать:
lshw -class disk -class storage | less
И просмотрите вывод для своего диска. В less
, попробуйте / sdX и посмотрите на предыдущее, bus info
строки — первая просто скажет scsi@…
, но несколько строк, прежде чем это будет более поучительно. Однако действительно необходимо выполнить это как суперпользователь, таким образом, это не может подойти. (признаки: на ноутбуке я попробовал его, это перечислило диск SATA, но не USB один — работающий с sudo
перечисленный оба)
Существуют другие также, более или менее прямые, чем эти.
Необходимо поместить выражение в кавычки. Ошибка, которую Вы получаете, является результатом удара, интерпретирующего (
как специальный символ.
Кроме того, необходимо сказать grep использовать расширенные регулярные выражения.
$ grep -E '(then|there)' x.x
Без расширенных регулярных выражений необходимо выйти |
, (
, и )
. Обратите внимание, что мы используем одинарные кавычки здесь. Bash рассматривает обратные косые черты в двойных кавычках особенно.
$ grep '\(then\|there\)' x.x
Группировка не необходима в этом случае.
$ grep 'then\|there' x.x
Это было бы необходимо для чего-то вроде этого:
$ grep 'the\(n\|re\)' x.x
Просто быстрое приложение, большинство ароматов имеет команду, названную egrep, который является просто grep с-E. Я лично как намного лучше для ввода
egrep "i(Pod|Pad|Phone)" access.log
Чем использовать grep-E
Материал, зарегистрированный под РЕГУЛЯРНЫМИ ВЫРАЖЕНИЯМИ в (или по крайней мере, мой) страница справочника, на самом деле для расширенного regexps;
grep понимает три различных версии синтаксиса регулярного выражения: “основной”, “расширенный” и “жемчуг”. В GNU grep, нет никакого различия в доступной функциональности между основными и расширенными синтаксисами. В других реализациях основные регулярные выражения менее мощны. Следующее описание относится к расширенным регулярным выражениям; различия для основных регулярных выражений получены в итоге впоследствии.
Но grep не использует их по умолчанию - Вам нужно -E
переключатель:
grep "(then|there)" x.x
Поскольку (из страницы справочника снова):
Основной по сравнению с расширенными регулярными выражениями
В основных регулярных выражениях метасимволы?, +, {|, (и) теряют их особое значение; вместо этого используйте backslashed версии \?, +, {\|, (и).
Таким образом, можно также использовать:
grep "then\|there" x.x
Так как круглые скобки являются лишними в этом случае.
grep $'then\nthere'
иgrep -e then -e there
. Отметьте это\|
не является стандартным в BREs. Остальное. Bash рассматривает обратные косые черты особенно в двойных кавычках только прежде"
,$
,\
,`
и новая строка. – Stéphane Chazelas 14.07.2013, 19:46