Вопрос или проблема
У меня есть следующая структура каталогов:
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
Описание кода:
- Директория: Сначала мы задаем переменную
dir
, в которой хранится путь к директории, которую мы хотим проверить. - Расширения: Мы создаём массив
extensions
, содержащий все искомые расширения файлов. - Цикл: С помощью цикла
for
проходимся по каждому элементу массиваextensions
, проверяем, существуют ли файлы с данным расширением. - Проверка наличия файлов: Используя команду
ls
, мы проверяем наличие файлов с указанным расширением. Если таких файлов нет, переменнаяerror
устанавливается вtrue
, и выводится сообщение об отсутствии. - Вывод результата: После завершения всех итераций мы проверяем состояние переменной
error
. Если она равнаtrue
, выводим сообщение о том, что некоторые файлы отсутствуют. Иначе выводим сообщение о том, что все необходимые файлы присутствуют.
Замечания:
- Убедитесь, что у вас есть необходимые права доступа для чтения директории.
- Вывод сообщений об отсутствии файлов осуществляется через стандартный вывод ошибок (stderr) с помощью
>&2
, что позволяет отделить нормальный вывод от сообщений об ошибках.
Таким образом, данный скрипт позволит вам легко проверить наличие нужных файлов с учётом указанных расширений.