Как перебрать список расширений, чтобы проверить, существуют ли файлы каждого типа?

Вопрос или проблема

У меня есть следующая структура каталогов:

main_dir/
│   ├── randstr1.randstr2.tar.gz
│   ├── randstr3.randstr4.tar.gz
│   ├── randstr5.randstr6.tar.gz
│   ├── randstr7.ext2
│   └── randstr8.ext3

Существует три возможных расширения файлов: .tar.gz, .ext1 и .ext2. Везде, где я написал randstr, находится случайная строка, которая не может быть известна заранее. Есть только один файл каждого типа .ext1 и .ext2, но будет много (неизвестного заранее) файлов типа .tar.gz.

Мне нужен способ установить флаг, если какой-либо из файлов отсутствует. Мне нужно удостовериться, что в этом каталоге есть хотя бы один файл каждого из трех типов расширений. Я хотел бы сделать это с помощью цикла, если возможно (чтобы научиться).

Я попробовал сделать это так, но, похоже, это не сработало:

error=false
# Перебираем каждое из трех расширений и проверяем, существует ли файл
for ext in ext1 ext2 tar.gz; do
    filenames=( "maindir"/*."$ext" )
    if [ "${#filenames[@]}" -eq 0 ]; then
        error=true
        break
    fi
done

if "$error"; then
    echo 'Один или несколько файлов отсутствуют' >&2
else
    echo "Все файлы на месте"
fi

(Я использую bash на Debian 12)

Перебрать расширения. Найти первый файл, соответствующий шаблону. Выдать ошибку, если ни один не найден.

#!/bin/sh
#
dir=main_dir

missing=
for ext in tar.gz ext1 ext2
do
    if [ -z "$(find "$dir" -maxdepth 1 -type f -name "*.$ext" -print -quit)" ]
    then
        missing=1
        break
    fi
done
if [ "${missing:-0}" -gt 0 ]
then
    echo "Упс, отсутствует хотя бы один необходимый файл в '$dir'" >&2
fi

Замените missing=1 и break на missing=$((missing+1)), если хотите знать, сколько типов расширений отсутствует. Вы также можете собрать отсутствующие типы расширений в строку (или массив, если вы используете оболочку, такую как bash, которая поддерживает их) для последующего использования. Здесь много вариантов в зависимости от того, что вы хотите достичь в процессе проверки.

С помощью zsh:

if ()(( $# == 3 )) main_dir/*.{ext1,ext2,tar.gz}(NY1); then
  print По крайней мере один файл каждого расширения существует
fi

Или со списком расширений в массиве:

ext=(ext1 ext2 tar.gz)
if ()(( $# == $#ext )) main_dir/*.$^ext(NY1); then
  print По крайней мере один файл каждого расширения существует
fi

Ответ или решение

Для того чтобы проверить наличие файлов с определёнными расширениями в указанной директории, вы можете использовать циклы и условные конструкции в Bash. Ниже я предложу вам завершённое решение, которое позволит проверить наличие хотя бы одного файла для каждого из трёх указанных расширений: .tar.gz, .ext1 и .ext2. Если какого-либо файла не хватает, мы выведем соответствующее сообщение.

#!/bin/bash

# Указываем директорию, которую нужно проверить
dir="main_dir"

# Переменная для хранения расширений
extensions=("tar.gz" "ext1" "ext2")

# Переменная для отслеживания ошибок
error=false

# Проходим по каждому расширению из массива
for ext in "${extensions[@]}"; do
    # Ищем файлы с текущим расширением
    if ! ls "$dir"/*."$ext" &> /dev/null; then
        # Если файлы не найдены, устанавливаем переменную error в true
        error=true
        echo "Файл с расширением .$ext отсутствует." >&2
    fi
done

# Проверяем, есть ли ошибки
if [ "$error" = true ]; then
    echo "Одно или несколько файлов отсутствуют." >&2
else
    echo "Все необходимые файлы присутствуют."
fi

Описание кода:

  1. Директория: Сначала мы задаем переменную dir, в которой хранится путь к директории, которую мы хотим проверить.
  2. Расширения: Мы создаём массив extensions, содержащий все искомые расширения файлов.
  3. Цикл: С помощью цикла for проходимся по каждому элементу массива extensions, проверяем, существуют ли файлы с данным расширением.
  4. Проверка наличия файлов: Используя команду ls, мы проверяем наличие файлов с указанным расширением. Если таких файлов нет, переменная error устанавливается в true, и выводится сообщение об отсутствии.
  5. Вывод результата: После завершения всех итераций мы проверяем состояние переменной error. Если она равна true, выводим сообщение о том, что некоторые файлы отсутствуют. Иначе выводим сообщение о том, что все необходимые файлы присутствуют.

Замечания:

  • Убедитесь, что у вас есть необходимые права доступа для чтения директории.
  • Вывод сообщений об отсутствии файлов осуществляется через стандартный вывод ошибок (stderr) с помощью >&2, что позволяет отделить нормальный вывод от сообщений об ошибках.

Таким образом, данный скрипт позволит вам легко проверить наличие нужных файлов с учётом указанных расширений.

Оцените материал
Добавить комментарий

Капча загружается...