Escrevi um script para encontrar o índice de dispositivo desocupado por padrão. Ele aceita um padrão printf como /dev/v4l/by-id/usb-fushicai_usbtv007_300000000002-video-index%d
e encontra o primeiro arquivo inexistente.
Tomou a regra existente do pacote systemd e a reescreveu para usar o resultado do script em vez de ATTR{index}
. Como ATTR{index}
é inalterável, decidi usar meu próprio diretório para links simbólicos.
/etc/udev/rules.d/65-persistent-v4l-my.rules:
ACTION=="remove", GOTO="my_fix_v4l_index_end"
SUBSYSTEM!="video4linux", GOTO="my_fix_v4l_index_end"
ENV{MAJOR}=="", GOTO="my_fix_v4l_index_end"
IMPORT{program}="v4l_id $devnode"
SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id"
KERNEL=="video*", ENV{ID_SERIAL}=="?*", ENV{UNOCCUPIED_PATTERN}="v4l/by-id-my/$env{ID_BUS}-$env{ID_SERIAL}-video-index%%d"
IMPORT{program}="/usr/local/bin/find-unoccupied-device-index /dev/$env{UNOCCUPIED_PATTERN}"
KERNEL=="video*", ENV{ID_SERIAL}=="?*", SYMLINK+="v4l/by-id-my/$env{ID_BUS}-$env{ID_SERIAL}-video-index$env{UNOCCUPIED_INDEX}"
LABEL="my_fix_v4l_index_end"
/ usr / local / bin / find-não-ocupado-dispositivo-index:
#!/bin/bash
set -e
if [ $# != 1 ]; then
>&2 echo "usage: ${0##*/} prefix-%d-suffix"
exit 1
fi
echo "pattern: $1" >&2
for ((i=0;;i++)); do
filename='printf "$1" $i'
[ -e "$filename" ] || break
done
echo "unoccupied index: $i" >&2
echo "UNOCCUPIED_INDEX=$i"