IT-инфраструктура для бизнеса и творчества

Программа смены прав доступа и регистра имени файлов/каталогов на 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

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

{ "author_name": "Кирилл Гарифов", "author_type": "self", "tags": ["\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442","\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430","\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435","\u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435","\u043e\u043a\u043d\u043e","\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435","\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435","\u0432","mod"], "comments": 3, "likes": 0, "favorites": 0, "is_advertisement": false, "subsite_label": "dev", "id": 114130, "is_wide": true, "is_ugc": true, "date": "Sat, 21 Mar 2020 18:09:57 +0300", "is_special": false }
(function () { let cdnUrl = `https://specialsf378ef5-a.akamaihd.net/SelectelBranding/images/` let previousArticleNumber = null let currentArticleNumber = 0 let platform = 'Desktop' let articles = [ { name: 'camera', url: `${cdnUrl}CameraCat`, text: 'умную камеру для\u00A0наблюдения за\u00A0котиками', link: 'https://vc.ru/selectel/306690', num: 3 }, { name: 'chill', url: `${cdnUrl}ChillCat`, text: 'трекер, который подскажет, когда пора отдохнуть', link: 'https://vc.ru/promo/288561-eye-tracker', num: 1 }, { name: 'cloud', url: `${cdnUrl}CloudCat`, text: 'котика: даёшь ему «пять», а\u00A0он делает бэкап в облако', link: 'https://vc.ru/dev/294799-maneki-neko', num: 2 } ] let buttonCycle = document.querySelector('.button--cycle') let buttonChoose = document.querySelector('.button--choose') let buttonMobile = document.querySelector('.button--mobile') let textField = document.querySelector('.selectel-footer-subtitle') let imageAgent = document.querySelector('.image--agent') let banner = document.querySelector('.selectel-footer') buttonCycle.addEventListener('click', cycleClick) buttonChoose.addEventListener('click', () => sendEvent(`Promo ${articles[currentArticleNumber].num} Left`, 'Click')) buttonMobile.addEventListener('click', () => sendEvent(`Promo ${articles[currentArticleNumber].num} Left`, 'Click')) let media = window.matchMedia("(max-width: 570px)") media.addEventListener('change', matchMedia) function matchMedia() { if (media.matches) { platform = 'Mobile' } else { platform = 'Desktop' } update() } matchMedia() function cycleClick(event) { sendEvent(`Promo ${articles[currentArticleNumber].num} Right`, 'Click') if (event) { event.preventDefault() event.stopPropagation() } window.open('https://vc.ru/tag/selectelDIY', '_blank') //cycle(event) } function cycle(event) { // incrementArticleNumber() textField.innerHTML = generatedText() imageAgent.src = articles[currentArticleNumber].url + platform + '.svg?3' imageAgent.setAttribute("class", "") imageAgent.classList.add('image--agent', articles[currentArticleNumber].name) banner.href = articles[currentArticleNumber].link } function update() { banner.href = articles[currentArticleNumber].link imageAgent.src = articles[currentArticleNumber].url + platform + '.svg' textField.innerHTML = generatedText() } function incrementArticleNumber() { previousArticleNumber = currentArticleNumber if (currentArticleNumber >= articles.length - 1) { currentArticleNumber = 0 } else { currentArticleNumber++ } } const sendEvent = (label, action = 'Click') => { const value = `SelectelDIY — loc: Footer — ${label} — ${action}`; if (window.dataLayer !== undefined) { window.dataLayer.push({ event: 'data_event', data_description: value, }); } }; function generatedText() { let defaultText if (platform === 'Desktop') { defaultText = `Мы тут собрали %text%. Хотите научим?` } else { defaultText = `Мы тут собрали %text%.` } return defaultText.replace('%text%', articles[currentArticleNumber].text) } function getRandom(min, max) { min = Math.ceil(min) max = Math.floor(max) return Math.floor(Math.random() * (max - min + 1)) + min } (function create() { currentArticleNumber = getRandom(0, articles.length - 1) cycle() let page = document.querySelector('.page--entry') if (page) { function insertAfter() { let parents = page.querySelectorAll('[data-id="7"]') let referenceNode = parents[0] referenceNode.parentNode.insertBefore(banner, referenceNode.nextSibling); loaded() } setTimeout(() => insertAfter(), 0) } }()) function loaded() { banner.classList.add('loaded') } loadImages([ `${cdnUrl}CameraCatDesktop.svg`, `${cdnUrl}ChillCatDesktop.svg`, `${cdnUrl}CloudCatDesktop.svg`, `${cdnUrl}CameraCatMobile.svg`, `${cdnUrl}ChillCatMobile.svg`, `${cdnUrl}CloudCatMobile.svg?3`, ]) function loadImages(urls) { return Promise.all(urls.map(function (url) { return new Promise(function (resolve) { var img = document.createElement('img'); img.onload = resolve; img.onerror = resolve; img.src = url; }); })); } }())
0
3 комментария
Популярные
По порядку

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

2

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

1

Её тогда распубликовали из-за наплыва школьников-сокурсников автора :)

0
Читать все 3 комментария
Исследование: сотрудники хотели бы иметь комнату отдыха, бесплатный сок, а работодатели уже готовы покупать ЗОЖ-снеки

Онлайн-сервис доставки продуктов и товаров СберМаркет и исследовательское агентство Research Me спросили сотрудников, как они хотели бы питаться в офисе и что в нем видеть. В опросе приняли участие более 1500 работающих людей по всей России. Сервис также спросил работодателей – В2В-клиентов СберМаркета: что они покупают в офис, что точно никогда…

Как OTUS стал платформой для самореализации. История преподавателя

Наш преподаватель, специалист по Data Science, решил поделиться своей историей преподавания. Он рассказал, как пришел в эту сферу, с какими трудностями столкнулся на пути к преподаванию и что ему помогает. А еще поделился советами, как поддерживать внимание студентов и сделать занятия полезными и увлекательными.

Обучаюсь контекстной рекламе. Пока что Яндекс.Директ, в дальнейшем и Google.Adwords. Встала такая проблема, как практиковаться, как взять первые проекты для опыта чтобы начать работать на фрилансе?

ПСБ запустил личный кабинет для предпринимателей. Там можно следить онлайн за каждым своим терминалом

Сервис предоставляется бесплатно.

Потратил 400 тысяч рублей на накрутку поведенческих в Гугле. Подвожу итог

Всем привет. Это уже моя пятая статья про накрутку ПФ в поисковых системах Яндекс и Гугл. Довольно много о проверенных гипотезах было изложено в первой статье про Гугл, в этой же, я подведу небольшой итог по экспериментам за последние 8 месяцев.

Cloud CDN: что это такое, как устроено и кому нужно. Разбираем на примере бургеров

Cloud CDN — это сеть быстрой доставки статического контента в формате услуги облачного провайдера. Объяснить, как работает технология, проще всего на примере — сравнить Cloud CDN с популярным продуктом, который выглядит плюс-минус одинаково вне зависимости от того, заказали вы его в Москве, Питере или Нью-Йорке. Знакомьтесь: классический бургер.…

История о том, как Илон Маск бросил все дела ради работы новостным ведущим в России

А ещё выучил русский язык и переехал в РФ, чтобы работать на YouTube канале 42CHANNEL. А о том, как Илон в своём познании настолько преисполнился, что как будто бы уже 100 триллионов миллиардов лет проживает на триллионах и триллионах таких же планет, читайте в статье.

Илон Маск заявил, что Starship будет готова к орбитальному запуску в ноябре Статьи редакции

Компания должна получить разрешение регулятора.

Как не попасть в карьерную ловушку тимлида: личный опыт

Кажется, что тимлиду просто некуда расти: дальше надо либо идти в менеджмент, либо наоборот, становиться узконаправленным разработчиком. По просьбе «Лаборатории Касперского» Евгений Мацюк, который прошел в компании неординарный путь, рассказал о своих карьерных развилках во время и после тимлидства, а также поделился опытом горизонтального роста.

Как AliExpress забрал у меня $300

24.08 - оплачиваю заказ.

«Яндекс.Маркет» просто издевается

Заказал на яндекс-маркете яндекс-станцию + яндекс-модуль, списать денюжки у маркета личико не треснуло, а вот с доставкой началось откровенное издевательство.

null