Как проверить, являются ли все аргументы файлами?

Рядом с определением DFIDвы видите определение PFID(), которое печатает поля f_seq, f_oidи f_verFID. FID никогда не -используются в Lustre.

f_seq— это 64 -битовая последовательность (SEQ )номер. Это указывает, на каком MDT (или в конфигурациях DNE, на каком OST )находится диапазон инодов (или объектов ). Каждый MDT получает диапазон порядковых номеров, затем выделяет их (по одному )клиентам, и клиенты могут создавать новые файлы с этим порядковым номером.

f_oid— 32-битный идентификатор объекта -(OID ). Это указывает на объект в диапазоне SEQ, который выделяется клиентом всякий раз, когда создается новый файл. Для конфигураций DNE MDS выделяет OID для номеров SEQ, назначенных каждому OST.

f_ver— зарезервированное 32-битное -поле версии (VER ). Это предназначено для использования снимками/наборами данных для различения объектов, которые в противном случае имеют одинаковый SEQ/OID. Это поле также используется для объектов OST для хранения индекса чередования LOV для файла в xattr fid, так что макет LOV может быть восстановлен из объектов OST, если макет MDT поврежден.

См.https://www.eofs.eu/_media/events/elw11/08_johann_lombardi_hands_on_lustre_2.x.pdfдля более полного описания FID.

3
14.04.2020, 11:44
1 ответ

Чтобы проверить, являются ли все аргументы файлами, проще проверить, является ли один из аргументов не файлом:

for argument do
    if [ ! -f "$argument" ]; then
        printf 'Not a file: %s\n' "$argument" >&2
        exit 1
    fi
done

echo 'All arguments are files'

Это перебирает все позиционные параметры и проверяет каждый из них по очереди. Если найден файл, отличный от -, печатается ошибка и выполнение кода завершается.

Исследовать все аргументы:

for argument do
    if [ -f "$argument" ]; then
        printf 'Is a file: %s\n' "$argument"
    else
        printf 'Is not a file: %s\n' "$argument"
    fi
done

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

Обратите внимание, что "является файлом" на самом деле означает "является обычным файлом или символической ссылкой на обычный файл". Если вы хотите убедиться, что это не символическая ссылка на обычный файл, используйте

if [ ! -f "$argument" ] || [ -L "$argument" ]; then

как тест в первом цикле или

if [ -f "$argument" ] && [ ! -L "$argument" ]; then

как тест во втором цикле.

Первую строку цикла также можно записать

for argument in "$@"; do

... но люди, как правило, забывают ставить двойные кавычки $@, и в любом случае цикл вверху становится короче.

7
19.03.2021, 02:29

Теги

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