update finder, add file_size

This commit is contained in:
jadssss
2026-06-01 02:03:00 +03:00
parent 870548020d
commit 1af369d928
2 changed files with 405 additions and 31 deletions

139
finder.sh
View File

@@ -9,6 +9,7 @@ INPUT_DIR="."
NO_DEFAULT_EXCLUDES=0
EXCLUDE_DIRS=()
EXCLUDE_EXTS=()
PROGRESS_BAR=1 # новый флаг
# Функция помощи
show_help() {
@@ -23,6 +24,7 @@ show_help() {
echo " -e, --exclude-dir DIR Исключить директорию (можно несколько раз)"
echo " --exclude-ext EXT Исключить расширение файла (можно несколько раз)"
echo " -D, --no-default-excludes Не исключать .git (по умолчанию .git исключается)"
echo " --no-progress Отключить прогресс-бар"
echo " -h, --help Показать эту справку"
echo ""
echo "Примеры:"
@@ -35,6 +37,7 @@ show_help() {
echo " $0 -e build --exclude-ext log # Исключить папку build и .log файлы"
echo " $0 -D # Отключить встроенное исключение .git"
echo " $0 -i ~/projects -p .py # Показать .py файлы в указанной папке"
echo " $0 --no-progress # Без прогресс-бара"
}
# Парсинг аргументов
@@ -84,6 +87,10 @@ while [[ $# -gt 0 ]]; do
NO_DEFAULT_EXCLUDES=1
shift
;;
--no-progress)
PROGRESS_BAR=0
shift
;;
-h|--help)
show_help
exit 0
@@ -133,36 +140,54 @@ get_extension() {
fi
}
# Функция отображения прогресс-бара (как в первой версии)
show_progress() {
local current=$1
local total=$2
local width=50
local percentage=$((current * 100 / total))
local completed=$((current * width / total))
local remaining=$((width - completed))
if [[ $total -eq 0 ]]; then
percentage=0
completed=0
remaining=$width
fi
printf "\r["
printf "%${completed}s" | tr ' ' '='
printf "%${remaining}s" | tr ' ' ' '
printf "] %3d%% Обработано: %d/%d" "$percentage" "$current" "$total"
if [[ $current -eq $total ]] && [[ $total -gt 0 ]]; then
echo ""
fi
}
# Основная функция поиска и вывода
process_files() {
# Построение массива аргументов для find
local find_args=(".")
local has_target=0
# Глубина
if [[ $RECURSIVE -eq 0 ]]; then
find_args+=("-maxdepth" "1")
fi
# Только файлы
find_args+=("-type" "f")
# Стандартные исключения (только .git)
if [[ $NO_DEFAULT_EXCLUDES -eq 0 ]]; then
find_args+=("-not" "-path" "./.git/*" "-not" "-path" "./.git")
fi
# Пользовательские исключения директорий
for dir in "${EXCLUDE_DIRS[@]}"; do
dir="${dir%/}" # убрать слеш в конце
dir="${dir%/}"
local clean_dir="${dir#./}"
# Исключаем саму директорию и всё внутри неё
find_args+=("-not" "-path" "./$clean_dir" "-not" "-path" "./$clean_dir/*")
# На всякий случай, если вложена где-то ещё
find_args+=("-not" "-path" "*/$clean_dir/*" "-not" "-path" "*/$clean_dir")
done
# Фильтр по целевому расширению
if [[ -n "$TARGET_EXT" ]]; then
has_target=1
if [[ "$TARGET_EXT" == "no_extension" ]]; then
@@ -173,13 +198,11 @@ process_files() {
fi
fi
# Исключение расширений
for ext in "${EXCLUDE_EXTS[@]}"; do
ext=$(clean_ext "$ext")
find_args+=("-not" "-name" "*.$ext")
done
# Вывод информации при verbose
if [[ $VERBOSE -eq 1 ]]; then
echo "Рабочая директория: $WORK_DIR"
echo "Режим: $([[ $SHOW_PATHS -eq 1 ]] && echo 'Показ путей' || echo 'Статистика')"
@@ -188,11 +211,14 @@ process_files() {
[[ -n "$TARGET_EXT" ]] && echo "Целевое расширение: $TARGET_EXT"
[[ ${#EXCLUDE_DIRS[@]} -gt 0 ]] && echo "Исключаемые папки: ${EXCLUDE_DIRS[*]}"
[[ ${#EXCLUDE_EXTS[@]} -gt 0 ]] && echo "Исключаемые расширения: ${EXCLUDE_EXTS[*]}"
[[ $PROGRESS_BAR -eq 1 ]] && echo "Прогресс-бар: включен"
echo ""
fi
# ------------------------------------------------------------------
# РЕЖИМ ПОКАЗА ПУТЕЙ (без прогресс-бара, как раньше)
# ------------------------------------------------------------------
if [[ $SHOW_PATHS -eq 1 ]]; then
# Режим вывода путей
if [[ -n "$TARGET_EXT" ]]; then
echo "Пути к .$(clean_ext "$TARGET_EXT") файлам:"
else
@@ -206,9 +232,45 @@ process_files() {
done < <(find "${find_args[@]}" -print0 2>/dev/null)
echo "-------------------------"
echo "Найдено файлов: $count"
return
fi
# ------------------------------------------------------------------
# РЕЖИМ СТАТИСТИКИ
# ------------------------------------------------------------------
declare -A stats
local total_files=0
# Если прогресс-бар включён сначала собираем все файлы в массив,
# иначе работаем потоково (быстрее, без двойного прохода)
if [[ $PROGRESS_BAR -eq 1 ]]; then
echo "Сканирование файлов..."
# Собираем массив путей (используем mapfile, как в первой версии)
mapfile -d '' all_files < <(find "${find_args[@]}" -print0 2>/dev/null)
total_files=${#all_files[@]}
local processed=0
if [[ $total_files -gt 0 ]]; then
echo "Обработка файлов:"
fi
for file in "${all_files[@]}"; do
local ext
if [[ -n "$TARGET_EXT" ]]; then
ext=$(clean_ext "$TARGET_EXT")
else
ext=$(get_extension "$file")
fi
((stats["$ext"]++))
((processed++))
show_progress "$processed" "$total_files"
done
# После завершения прогресс-бара переводим строку (если файлы были)
if [[ $total_files -gt 0 ]]; then
echo ""
fi
else
# Режим статистики
declare -A stats
# Потоковый режим (без прогресс-бара) оригинальное поведение
while IFS= read -r -d '' file; do
local ext
if [[ -n "$TARGET_EXT" ]]; then
@@ -218,30 +280,45 @@ process_files() {
fi
((stats["$ext"]++))
done < <(find "${find_args[@]}" -print0 2>/dev/null)
# Подсчитаем общее количество для вывода (перебираем значения)
for count in "${stats[@]}"; do
((total_files += count))
done
fi
if [[ -n "$TARGET_EXT" ]]; then
local t=$(clean_ext "$TARGET_EXT")
echo "Статистика .$t файлов:"
echo "============================="
echo "$t: ${stats[$t]:-0}"
# Вывод статистики
if [[ -n "$TARGET_EXT" ]]; then
local t=$(clean_ext "$TARGET_EXT")
echo "Статистика .$t файлов:"
echo "============================="
echo "$t: ${stats[$t]:-0}"
else
echo "Статистика файлов:"
echo "================="
# Сортировка расширений по убыванию количества
for ext in "${!stats[@]}"; do
printf "%s %d\n" "$ext" "${stats[$ext]}"
done | sort -k2 -nr | while read ext count; do
printf "%-15s %d\n" "$ext" "$count"
done
# Если прогресс-бар НЕ использовался, total_files уже посчитан в цикле выше.
# Если использовался, пересчитаем из stats (т.к. total_files уже есть, но можно перестраховаться)
if [[ $PROGRESS_BAR -eq 0 ]]; then
# total_files уже посчитан, но если по какой-то причине нет пересчитаем
if [[ $total_files -eq 0 ]]; then
for count in "${stats[@]}"; do
((total_files += count))
done
fi
else
echo "Статистика файлов:"
echo "================="
local total_files=0
# Сортировка расширений по убыванию количества
for ext in "${!stats[@]}"; do
printf "%s %d\n" "$ext" "${stats[$ext]}"
done | sort -k2 -nr | while read ext count; do
printf "%-15s %d\n" "$ext" "$count"
done
# Суммируем (цикл выше в подоболочке, поэтому считаем отдельно)
total_files=0
for count in "${stats[@]}"; do
((total_files += count))
done
echo "-------------------------"
echo "Всего файлов: $total_files"
echo "Уникальных расширений: ${#stats[@]}"
fi
echo "-------------------------"
echo "Всего файлов: $total_files"
echo "Уникальных расширений: ${#stats[@]}"
fi
}