Ошибка синтаксиса рядом с неожиданным токеном `COPY14 `

Файлы в каталоге /dev являются фактическими файлами устройств, которые UDEV создает во время выполнения. Каталог /sys/class экспортируется ядром во время выполнения, раскрывая иерархию аппаратного обеспечения через sysfs.

Из учебника по libudev и Sysfs

выдержка

В Unix и Unix-подобных системах доступ к аппаратным устройствам осуществляется через специальные файлы (также называемые файлами устройств или узлами), расположенные в каталоге /dev. Эти файлы читаются и записываются как обычные файлы, но вместо записи и чтения данных на диск они напрямую взаимодействуют с драйвером ядра, который затем взаимодействует с оборудованием. Существует множество интернет-ресурсов, описывающих файлы /dev более подробно. Традиционно эти специальные файлы создавались при установке дистрибутива с помощью команды mknod. В последние годы системы Linux начали использовать udev для управления этими файлами /dev во время выполнения. Например, udev будет создавать узлы при обнаружении устройств и удалять их при удалении устройств (включая устройства hotplug во время выполнения). Таким образом, каталог /dev содержит (по большей части) только записи для устройств, которые реально существуют в системе в текущий момент времени, в отличие от устройств, которые могли бы существовать.

еще один отрывок

Каталоги в Sysfs содержат иерархию устройств, как они подключены к компьютеру. Например, на моем компьютере устройство hidraw0 находится в каталоге:

/sys/devices/pci0000:00/0000:00:12.2/usb1/1-5/1-5.4/1-5.4:1.0/0003:04D8:003F.0001/hidraw/hidraw0

Судя по пути, устройство подключено к (грубо, начиная с конца) конфигурации 1 (:1.0) устройства, подключенного к порту номер 4 устройства 1-5, подключенного к USB-контроллеру 1 (usb1), подключенного к шине PCI. Хотя это и интересно, такой путь к каталогу не приносит нам много пользы, поскольку он зависит от того, как аппаратное обеспечение физически подключено к компьютеру.

К счастью, Sysfs также предоставляет большое количество симлинков для легкого доступа к устройствам без необходимости знать, к каким портам PCI и USB они подключены. В /sys/class есть каталог для каждого класса устройств.

Использование?

В общем случае вы используете правила в /etc/udev/rules.d для дополнения вашей системы. Правила могут быть созданы для запуска сценариев при наличии различного оборудования.

После запуска системы вы можете написать скрипты для работы с /dev или /sys, и это действительно сводится к личным предпочтениям, но я обычно стараюсь работать с /sys и использовать такие инструменты, как udevadm для запроса UDEV о расположении различных системных ресурсов.

$ udevadm info -a -p  $(udevadm info -q path -n /dev/sda) | head -15

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda':
    KERNEL=="sda"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{ro}=="0"
    ATTR{size}=="976773168"
    ATTR{stat}==" 6951659  2950164 183733008 41904530 16928577 18806302 597365181 580435555        0 138442293 622621324"
    ATTR{range}=="16"
...

0
07.12.2018, 20:25
3 ответа
for filename in "$1"/*; do
    if [ -f "$filename" ] &&
       [ "${filename%.old}" = "$filename" ]
    then
        mv -- "$filename" "$filename.old"
    fi
done 

Используйте grepдля текста и используйте вывод lsдля чтения глазами, а не в качестве входных данных для программы.

Ошибка, которую вы получаете, связана с синтаксической ошибкой в ​​вашем коде. Синтаксис цикла for(для перебора нескольких слов )таков:

for variable in word-list; do...; done

Код вверху будет циклически перебирать все обычные файлы в каталоге, указанном в $1, и присваивать им суффикс имени файла .old, если у них его еще нет. Два теста проверяют, относится ли $filenameк обычному файлу (или символической ссылке к одному из них ), и остается ли $filenameпри удалении .oldиз конца его значения прежним (. т.е. имеет ли он уже суффикс или нет ).

Другой способ сделать более или менее то же самое с помощьюfind:

find "$1" -maxdepth 1 -type f ! -name '*.old' -exec mv {} {}.old ';'

Обратите внимание, что оба решения будут перезаписывать любой уже существующий файл .old, если есть соответствующее имя файла без суффикса .old. Если бы существовал каталог с суффиксом .oldпод $1, файл был бы помещен в этот каталог, а не переименован.

Разница между решением findи циклом оболочки заключается в том, что решение findтакже заботится о скрытых именах, а цикл оболочки переименовывает символические ссылки в обычные файлы.

Связанные:

4
28.01.2020, 02:15

Вы, по сути, признали, что это домашнее задание. и не имеет отношения к реальной жизни. Как было написано в комментариях, ваш учитель, вероятно, хочет, чтобы вы сделали

for filename in $(ls "$1" | grep -v '\.old$')

Если ваш учитель чрезвычайно глуп, непросветлен, они могут предпочесть, чтобы вы опустили кавычки \и $. Пожалуйста, познакомьте своего учителя с Unix & Linux Stack Exchange . Но если ваш учитель не может или не хочет научиться делать что-то правильно, затем делать домашнее задание так, как они хотят.

Тогда немедленно забудь об этом, потому что оно ошибочно.


Вот вариант ответа Кусалананды это может быть немного легче читать. (Я добавил проверку ошибок, потому что это правильно ™.)

if [ "$1" = "" ]
then
    printf 'Usage:  %s <directory-name>\n' "$0"
    exit 1
fi
if [ ! -d "$1" ]
then
    printf 'Error: %s is not a directory.\n' "$1"
    exit 2
fi
for filename in "$1"/*
do
    case "$filename" in
       (*.old)                  # Skip
        ;;
       (*)
        mv -- "$filename" "$filename.old"
    esac
done

Вы также можете

  • обрабатывает случай, когда $1является каталогом, но либо
    • у вас нет на это полного разрешения или
    • пусто.
  • спросите, должны ли вы переименовывать каталоги, символические ссылки и многое другое.
1
28.01.2020, 02:15

С bash и расширенным расширением файла:

shopt -s extglob
for file in !(*.old); do...
1
28.01.2020, 02:15

Теги

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