Суть работы заключается в том,
чтобы обработать каждый элемент массива, который берётся из содержимого директории и проверить на файл либо чтение. В случае лжи, удалить этот элемент из массива.
#!/usr/bin/env bash
main {
clear;
files=(*);
for file in ${files[@]};
do
if [[ -d "${file}" ]] || [[ ! -r "${file}" ]];
then
unset files[$file]; continue;
fi;
done;
} main;
main() {
clear
# Инициализация массива с файлами текущей директории
files=(*)
# Создание нового массива для хранения отфильтрованных файлов
declare -a valid_files
for file in "${files[@]}"; do
# Проверка, является ли элемент файлом и доступен ли он для чтения
if [[ -f "$file" ]] && [[ -r "$file" ]]; then
valid_files+=("$file") # Добавление файла в массив, если условия выполнены
fi
done
# Перезапись исходного массива files отфильтрованными элементами
files=("${valid_files[@]}")
# Вывод результатов
echo "Отфильтрованные файлы:"
printf '%s\n' "${files[@]}"
}
инетренос
стаковерфлоу не рекомендует использовать мутиюрущие массивы
#!/bin/bash
declare -a X
while read L ; do X+=("$L") ; done < <( ls -1 . )
for Y in "${X[@]}" ; do
if [ -d $Y ] || [ ! -r $Y ] ; then X=("${X[@]/$Y}") ; fi
done
declare -a Z
for i in "${!X[@]}"; do
if [ ! -z "${X[i]}" ]; then Z+=( "${X[i]}" ) ; fi
done
X=("${Z[@]}")
unset Z
printf "'%s'\n" "${X[@]}"
если помогло - я положу в ответы вы отметите решением