Некоторые типы файловой системы поддерживают ACLs без опции монтирования, другие только с опцией монтирования. Для ext2/ext3/ext4 некоторые опции монтирования по умолчанию включая acl/noacl хранятся в файловой системе (Вы видите это в tune2fs -l /dev/BLOCK_DEVICE | grep '^Default mount options:'
). Как отмечено don_crissti, для ext4, показывается ли вариант или не зависит от версии ядра (так как ядро 2.6.39, acl
значения по умолчанию на том, независимо от того, что файловая система говорит). Файловые системы, такие как vfat и minix не имеют никакой поддержки ACL. Файловые системы, такие как tmpfs, xfs и zfs всегда поддерживают ACLs.
Если Вы не хотите создать и поддержать большую таблицу типов файловой системы, версий, команды для проверки значений по умолчанию и версий ядра, нет никакого способа определить, поддерживает ли файловая система ACLs через опции монтирования или характеристики файловой системы. Вы не можете сказать чистым наблюдением с getfacl
любой, поскольку это будет всегда, по крайней мере, сообщать о полномочиях Unix. Даже если файловая система поддерживает ACLs, она не может поддерживать типы ACL, которые Вы хотите. Таким образом, Ваш лучший выбор состоит в том, чтобы звонить setfacl
(или базовые API C) чтобы попытаться установить ACL, Вы хотите. Если ошибочное состояние будет EOPNOTSUPP (Операция, не поддерживаемая), то Вы будете знать, что файловая система не поддерживает (этот тип) ACLs.
Ты можешь использовать 2 грэпа, чтобы получить то, что ты хочешь. Внутренний grep
сгенерирует "список" совпадений для текущего ядра, uname -r
и предыдущий возврат к нему. Внешний grep
выдаст список ядра, исключая эти 2.
$ grep -v "$(grep -B 1 "$(uname -r)" list.txt)" list.txt
Для имитации того, что у вас есть, я добавил их содержимое в файл list.txt
.
$ cat list.txt
linux-image-3.2.0-49-generic
linux-image-3.2.0-51-generic
linux-image-3.2.0-52-generic
linux-image-3.2.0-53-generic
linux-image-3.2.0-54-generic
linux-image-3.2.0-55-generic
linux-image-3.2.0-56-generic
linux-image-3.2.0-57-generic
linux-image-3.2.0-58-generic
linux-image-3.2.0-59-generic
linux-image-3.2.0-60-generic
linux-image-3.2.0-61-generic
linux-image-3.2.0-63-generic
linux-image-3.2.0-64-generic
Теперь представим, что команда uname -r
возвращает эту строку:
$ uname -r
3.2.0-60-generic
Поэтому при выполнении этой команды я получаю список ядер минус uname -r
и предыдущую версию.
$ grep -v "$(grep -B 1 "3.2.0-60-generic" list.txt)" list.txt
linux-image-3.2.0-49-generic
linux-image-3.2.0-51-generic
linux-image-3.2.0-52-generic
linux-image-3.2.0-53-generic
linux-image-3.2.0-54-generic
linux-image-3.2.0-55-generic
linux-image-3.2.0-56-generic
linux-image-3.2.0-57-generic
linux-image-3.2.0-58-generic
linux-image-3.2.0-61-generic
linux-image-3.2.0-63-generic
linux-image-3.2.0-64-generic
Все это предполагает, что список ядер в list.txt
находится в отсортированном формате.
Если вам интересно, я написал A к этому вопросу и ответу под заголовком: Как программно определить самую старшую версию установленного RPM ядра?, где я показываю, как можно разобрать версии ядер, используя сортировку -V
.
Так как мы определённо работаем с linux здесь вы можете использовать GNU ls
до -v
результатов сортировки ersion. Учитывая это, а также то, что имена файлов вашего ядра вряд ли будут содержать какие-либо странные символы, которые вы могли бы сделать:
ls -1v /boot/linux-image* | grep "$(uname -r)" -B1
Поскольку вы упомянули список, я предполагаю, что он находится в каком-то файле. Тем не менее, команду можно легко изменить.
Более простой подход:
current_ver=$(uname -r)
awk "/$current_ver/{y=1;next}y" list
В переменной current_ver
хранится текущая версия ядра. Команда awk
получает вывод после текущей версии.
P.S:
Я не очень хорошо разбираюсь в awk
. Команда может быть дополнительно улучшена :)