Назад | Перейти на главную страницу

Почему unix find не может перечислить все, что находится ниже / sys?

Я хотел бы найти каждое устройство, у которого есть опция / файл повторного сканирования в / sys / devices (чтобы я мог изменять размер дисков на лету), но UNIX find, похоже, их не находит. Например:

# file /sys/class/block/sda/device/rescan
/sys/class/block/sda/device/rescan: writable, regular file, no read permission

Но:

# find /sys/class/block -name 'rescan'

Возвращается пустым.

Кроме того, find находит только родительское устройство, т.е.

# find /sys/class/block 
/sys/class/block
/sys/class/block/fd0
/sys/class/block/sda
/sys/class/block/sr0
/sys/class/block/dm-0
/sys/class/block/dm-1
/sys/class/block/dm-2
/sys/class/block/sda1
/sys/class/block/sda2
/sys/class/block/sda3

Когда на самом деле под этими устройствами находится много опций / файлов (если вы знаете, где искать), например:

# ls -1 /sys/class/block/sda/device/
block
bsg
delete
device_blocked
device_busy
dh_state
driver
eh_timeout
evt_capacity_change_reported
evt_inquiry_change_reported
evt_lun_change_reported
evt_media_change
evt_mode_parameter_change_reported
evt_soft_threshold_reached
generic
inquiry
iocounterbits
iodone_cnt
ioerr_cnt
iorequest_cnt
modalias
model
power
queue_depth
queue_ramp_up_period
queue_type
rescan
rev
scsi_device
scsi_disk
scsi_generic
scsi_level
state
subsystem
timeout
type
uevent
unpriv_sgio
vendor
vpd_pg80
vpd_pg83
wwid

Заранее спасибо,

Патрик

Содержимое ниже / sys содержат много символических ссылок, например родительские устройства ты хочешь искать в / системный / класс / блок.
find по умолчанию не следует по символическим ссылкам, что означает find не будет искать в каталогах, содержащих символические ссылки.

Это поведение можно изменить с помощью -L переключатель find чтобы он переходил по символическим ссылкам.
Из-за характера / sys и множество символических ссылок в этой структуре каталогов, find обнаружит петли файловой системы и сообщите об этом в командной строке на stderr. Чтобы отфильтровать эти сообщения, вы можете запустить find команду следующим образом.

find -L /sys/class/block -name 'rescan' 2> /dev/null