Программа смены прав доступа и регистра имени файлов/каталогов на Bash

В рамках задания на лабораторных занятиях нам необходимо было написать скрипт, который должен был, при вводе соответствующего ключа, менять регистр букв в имени файла/каталога с верхнего на нижний и наоборот, менять регистр первой буквы каждого слова в имени на верхний, отдельными ключами, которые не должны исполняться самостоятельно: делать те же преобразования но с выводом информации в терминал и выполнять изменения регистра рекурсивно.

С подначек преподавателя по ходу написания скрипта, он обрастал дополнительными возможностями. Так в нашем скрипте сначала появились проверки на наличие запрещенных символов в именах файлов и кириллицы, проверка на наличие прав на запись (нами было решено ограничиться файлами с правами на запись):

if [[ -w \"$n\" ]]; then if [[ "$adress" != *[А-Яа-яЁё]* ]] && [[ "$adress" != *[\"\`\'\:\?\<\>\|\!]* ]]; then

После добавления различных проверок и предусмотрения различного рода ошибок, возник вопрос, что будет если система не сможет воспроизводить русский язык? Вопрос это имел место быть, т.к. вся информация выдаваемая пользователя писалась на русском. Некоторое время мы игнорировали этот вопрос, преподаватель про него не вспоминал и ладно, зато мы переделали наш скрипт и сделали для него графический интерфейс при помощи Zenity.Для удобства работы мы разбили скрипт на несколько файлов, в начальном файле задаются переменные, которые затем передаются дальше, и проводится проверка на наличие Zenity.

pr_way=`pwd` pr_way="${pr_way#*$USER/}" pr_name="$0" pr_name="${pr_name#*/}" start_scr="0" #---------------------------------------------------------------- if find /usr/bin/zenity then cd selection ./language.sh "$pr_way" "$pr_name" "$start_scr" else echo "Zenity is not installed on this computer." fi

Сделав полностью графический интерфейс мы вернулись к вопросу языка, ограничились тремя языками русским, английским и белорусским. Язык выбирается автоматически, в зависимости от вашего системного языка, если он не окажется одним из этих трех, то просто откроется окно выбора языка, где вы сможете выбрать его самостоятельно.

if [[ $LANG == *["ru"]* ]]; then ./key-ru.sh "$pr_way" "$pr_name" "$start_scr" elif [[ $LANG == *["en"]* ]]; then ./key-en.sh "$pr_way" "$pr_name" "$start_scr" elif [[ $LANG == *["by"]* ]]; then ./key-by.sh "$pr_way" "$pr_name" "$start_scr" elif [[ $LANG != *["ru"]* ]] && [[ $LANG == *["en"]* ]] && [[ $LANG == *["by"]* ]]; then language=$(zenity \ --list --width=400 --height=150 \ --title="Language selection" \ --text="Sorry. This program does not support your system language. Please, select language below." \ --column="Language" \ "Russian" \ "English" \ "Belarussian" )

После определения языка, на котором вы будете работать дальше, открывается окно с выбором ключа.

После того как вы определились, что хотите сделать выбираете ключ и переходите к выбору файла/каталога, с которым вы будете это делать.

Завершив работу, программа вам сообщит о том, что произошло и любезно поинтересуется хотите ли вы продолжать дальше.

Бонусом мы добавили в нашу программу возможность смены прав доступа файлов/каталогов, это было нашим предыдущим заданием, поэтому и было решено совместить их.

#!/bin/bash #получение переменных из предыдущего скрипта adress="$1" pr_way="$2" pr_name="$3" echo cd #проверка на наличие в адресе "/", что означает, что нужный файл/каталог находится в каком-то каталоге if [[ "$adress" == *["/"]* ]]; then #отсечение пути и имени файла/каталога от адреса way="${adress%/*}" name="${adress##*/}" cd "$way" else #в случае отсутствия "/" в адресе, именем файла/каталога становится адрес name="$adress" fi #окно выбора формата ввода прав доступа format=$(zenity \ --list --width=400 --height=150 \ --title="Выбор формата прав доступа" \ --text="Выберите, пожалуйста, формат присвоения прав доступа." \ --column="Формат" \ "Числовой" \ "Буквенный" ) #завершение программы при закрытии окна if [ $? -eq "1" ];then exit fi case "$format" in Числовой) #окно ввода числового формата выбора прав доступа mod=$(zenity \ --entry \ --title="Выбор прав доступа" \ --text="Введите, пожалуйста, права, которые Вы хотите присвоить '$name'. Права должны состоять из трехзначного числа, включающего в себя цифры от 0 до 7: 0 – ничего не разрешено; 1 – разрешено только исполнение; 2 – разрешена только запись; 3 – разрешены исполнение и запись; 4 – разрешено только чтение; 5 – разрешены чтение и исполнение; 6 – разрешены чтение и запись; 7 – все разрешено." \ --entry-text="") #завершение программы при закрытии окна if [ $? -eq "1" ];then exit fi #проверка правильности ввода формата (3х значаное число, состоящее из цифр от 0 до 7) if [[ $mod == *[0-7]* ]] && [[ ${#mod} = 3 ]]; then #изменение прав доступа chmod $mod "$name" #результат выполнения программы zenity --info --title="Завершение программы" --text="'$name' успешно присвоены права '$mod'." else zenity --error --title="Ошибка!" --text="Введен неверный формат прав доступа. Пожалуйста, проверьте введенного Вами формата прав доступа и повторите позже." fi ;; Буквенный) #окно ввода буквенного формата прав доступа mod=$(zenity \ --entry --width=600 \ --title="Выбор прав доступа" \ --text="Введите пожалуйста права, которые Вы хотите дать '$name'. Права должны включать в себя того, у кого будут изменены права (u/g/o/a), знак, который изменяет права (+/-/=) и какие права будут изменены (r/w/x): u – пользователь; g – группа; o – остальные; a – все; + – разрешить; - – запретить; = – присвоить; r – чтение; w – запись; x – исполнение." \ --entry-text="") #завершение программы при закрытии окна if [ $? -eq "1" ];then exit fi #проверка правильности ввода формата прав доступа и последующее изменение прав доступа и вывод результата if [[ $mod == *[ugoa]*+*[rwx]* || $mod == *[ugoa]*-*[rwx]* || $mod == *[ugoa]*"="*[rwx]* ]]; then chmod $mod "$name" zenity --info --title="Результат" --text="'$name' успешно присвоены права '$mod'." elif [[ $mod == +*[rwx]* ]] || [[ $mod == -*[rwx]* ]] || [[ $mod == =*[rwx]* ]]; then pre_mod="${mod%[-+=]*}" pre_mod+=" " if [[ $pre_mod == " " ]]; then pre_mod="${pre_mod/ /a}" echo "$pre_mod" pre_mod+="$mod" mod="$pre_mod" echo "$mod" fi chmod $mod "$name" zenity --info --title="Результат" --text="'$name' успешно присвоены права '$mod'." else zenity --error --title="Ошибка!" --text="Введен неверный формат прав доступа. Пожалуйста, проверьте введенного Вами формата прав доступа и повторите позже." fi ;; esac cd cd ""$pr_way"/selection" #окно выбора следующего шага или завершение программы при закрытии окна next=$(zenity \ --list --width=400 --height=200 \ --title="Выбор следующего шага" \ --text="Выберите, пожалуйста, с какого пункта Вы хотите продолжить работу в программе, либо закройте данное, окно, если хотите завершить работу." \ --column="Выбор" \ "Выбор ключа" \ "Выбор файла или папки" ) case $next in "Выбор ключа") start_scr="0" ./key-ru.sh "$pr_way" "$pr_name" "$start_scr" ;; "Выбор файла или папки") start_scr="C" ./key-ru.sh "$pr_way" "$pr_name" "$start_scr" ;; esac

Ссылка на всю нашу работу, для подробного ознакомления с ней, прилагается.

0
3 комментария
Bulat Ziganshin

если бы я здесь публиковал каждую хрень которую делал когда учился, то vc на много лет вперёд был бы обеспечен материалами :D

Ответить
Развернуть ветку
Nick Sidorov

Была же эта статья уже

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
0 комментариев
Раскрывать всегда