Как я комбинирую-v и переключатели-B в grep?

Некоторые типы файловой системы поддерживают 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.

5
12.06.2014, 22:57
3 ответа

Ты можешь использовать 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.

.
2
27.01.2020, 20:40

Так как мы определённо работаем с linux здесь вы можете использовать GNU ls до -vрезультатов сортировки ersion. Учитывая это, а также то, что имена файлов вашего ядра вряд ли будут содержать какие-либо странные символы, которые вы могли бы сделать:

ls -1v /boot/linux-image* | grep "$(uname -r)" -B1
1
27.01.2020, 20:40

Поскольку вы упомянули список, я предполагаю, что он находится в каком-то файле. Тем не менее, команду можно легко изменить.

Более простой подход:

current_ver=$(uname -r)
awk "/$current_ver/{y=1;next}y" list

В переменной current_ver хранится текущая версия ядра. Команда awk получает вывод после текущей версии.

P.S:

Я не очень хорошо разбираюсь в awk . Команда может быть дополнительно улучшена :)

1
27.01.2020, 20:40

Теги

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