Установка исполнимого флага для директории расшаренной в Виндовс
This commit is contained in:
parent
810e6ec436
commit
a5ee241e15
142
scan_to_exe_and_set_x_flag.sh
Executable file
142
scan_to_exe_and_set_x_flag.sh
Executable file
@ -0,0 +1,142 @@
|
||||
#!/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}"
|
||||
Loading…
x
Reference in New Issue
Block a user