nas_scripts/scan_to_exe_and_set_x_flag.sh

143 lines
5.3 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# Совместим с TrueNAS CORE (FreeBSD) и SCALE (Linux)
# Безопасен при перенаправленном stdin
# Проверка наличия терминала для интерактивного режима
if [[ -t 0 ]]; then
INTERACTIVE=1
else
INTERACTIVE=0
echo "Внимание: stdin не подключён к терминалу. Режим подтверждения отключён."
echo "Используйте флаг --force для автоматического выполнения."
if [[ "$*" != *"--force"* ]]; then
exit 1
fi
fi
# Цвета (только если вывод в терминал)
if [[ -t 1 ]]; then
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; NC='\033[0m'
else
RED=''; GREEN=''; YELLOW=''; BLUE=''; NC=''
fi
# Проверка аргумента
if [[ $# -lt 1 ]] || [[ "$1" == "--help" ]] || [[ "$1" == "-h" ]]; then
echo "Использование: $0 [--force] <путь_к_директории>"
echo " --force Пропустить подтверждение (для автоматизации)"
exit 1
fi
# Обработка флага --force
FORCE=0
if [[ "$1" == "--force" ]]; then
FORCE=1
shift
fi
TARGET_DIR="$1"
# Проверка директории
if [[ ! -d "$TARGET_DIR" ]]; then
echo -e "${RED}Ошибка:${NC} Директория не существует: $TARGET_DIR" >&2
exit 1
fi
# Нормализация пути
TARGET_DIR="$(cd "$TARGET_DIR" 2>/dev/null && pwd || echo "$TARGET_DIR")"
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}Подготовка к обработке Windows-файлов${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""
echo -e "Директория: ${YELLOW}${TARGET_DIR}${NC}"
echo -e "Расширения: ${YELLOW}.exe .bat .cmd .com${NC} (любой регистр)"
echo -e "Права: ${YELLOW}ug+x${NC} (владелец + группа)"
echo ""
# Подсчёт файлов (безопасный метод для BSD)
FILE_COUNT=0
while IFS= read -r -d '' file 2>/dev/null; do
((FILE_COUNT++)) 2>/dev/null || FILE_COUNT=$((FILE_COUNT + 1))
done < <(find "$TARGET_DIR" -type f \( -iname "*.exe" -o -iname "*.bat" -o -iname "*.cmd" -o -iname "*.com" \) -print0 2>/dev/null || true)
echo -e "Найдено файлов: ${GREEN}${FILE_COUNT}${NC}"
echo ""
if [[ $FILE_COUNT -eq 0 ]]; then
echo -e "${YELLOW}Не найдено подходящих файлов. Обработка не требуется.${NC}"
exit 0
fi
# Предпросмотр (только если интерактивно)
if [[ $INTERACTIVE -eq 1 ]]; then
echo -e "${BLUE}Примеры найденных файлов (первые 10):${NC}"
COUNT_PREVIEW=0
while IFS= read -r -d '' file 2>/dev/null; do
echo "$file"
COUNT_PREVIEW=$((COUNT_PREVIEW + 1))
[[ $COUNT_PREVIEW -ge 10 ]] && break
done < <(find "$TARGET_DIR" -type f \( -iname "*.exe" -o -iname "*.bat" -o -iname "*.cmd" -o -iname "*.com" \) -print0 2>/dev/null || true)
if [[ $FILE_COUNT -gt 10 ]]; then
echo " ... и ещё $((FILE_COUNT - 10)) файлов"
fi
echo ""
fi
# Подтверждение (только если интерактивно и не --force)
if [[ $INTERACTIVE -eq 1 && $FORCE -eq 0 ]]; then
echo -e "${YELLOW}Внимание:${NC} Будут изменены права ${GREEN}ТОЛЬКО${NC} для владельца и группы (ug+x)"
echo -n "Продолжить? (y/n) [n]: "
read -r CONFIRM || CONFIRM="n"
case "${CONFIRM,,}" in
y|yes|д|да)
echo -e "\n${GREEN}Подтверждено. Начинаем обработку...${NC}"
;;
*)
echo -e "\n${YELLOW}Операция отменена.${NC}"
exit 0
;;
esac
echo ""
elif [[ $FORCE -eq 1 ]]; then
echo -e "${YELLOW}Режим --force: подтверждение пропущено.${NC}"
echo ""
fi
# Обработка файлов
SUCCESS=0
FAILED=0
TOTAL=0
while IFS= read -r -d '' file 2>/dev/null; do
TOTAL=$((TOTAL + 1))
if chmod ug+x "$file" 2>/dev/null; then
BASENAME="${file##*/}"
echo -e "[${GREEN}OK${NC}] $BASENAME"
SUCCESS=$((SUCCESS + 1))
else
BASENAME="${file##*/}"
echo -e "[${RED}FAIL${NC}] $BASENAME (нет прав?)"
FAILED=$((FAILED + 1))
fi
done < <(find "$TARGET_DIR" -type f \( -iname "*.exe" -o -iname "*.bat" -o -iname "*.cmd" -o -iname "*.com" \) -print0 2>/dev/null || true)
# Итог
echo ""
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}Итог обработки${NC}"
echo -e "${BLUE}========================================${NC}"
echo -e "Успешно: ${GREEN}${SUCCESS}${NC}"
echo -e "Ошибок: ${RED}${FAILED}${NC}"
echo -e "Всего: ${BLUE}${TOTAL}${NC}"
echo ""
if [[ $FAILED -gt 0 ]]; then
echo -e "${YELLOW}Внимание:${NC} Некоторые файлы не обработаны (возможно, нет прав на запись)."
echo "Проверьте: mount -v | grep '${TARGET_DIR%/*}' — возможно, ФС смонтирована как read-only."
fi
echo -e "${GREEN}Готово.${NC}"