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 комментария
Главные новости недели: Apple MacBook Pro, новое название Facebook, запрет Samsung Pay

Говорим о главных новостях недели в подкасте Telegram-канала ForGeeks. Сегодня в гостях Павел Беседин, ведущий на Европе Плюс и гик. Мы обсудили, почему новые MacBook Pro такие крутые, зачем Facebook решил поменять название, запретят ли в России Samsung Pay и когда уже выпустят Cyberpunk 2077 для PlayStation 5. Слушайте, читайте и подписывайтесь.

Почему «без ТЗ результат ХЗ». Разбираем на примере CRM-систем

К нам пришел клиент, который уже пробовал внедрять CRM-систему, и принес наработки предыдущих интеграторов. У него была вроде бы работающая система, но никто ей не пользовался. В статье разберемся, почему так получается, и как делать так, чтобы такого не было.

Пример нотации согласовательного уровня Библиотека примеров BPMN
Как не попасть в карьерную ловушку тимлида: личный опыт

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

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

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

Дизайн-джем #42: мифы и легенды о русалках, японские рассказы, космические приключения и азы точных наук

В красочном дайджесте, посвящённом детским книжным иллюстрациям, от Futura by red_mad_robot.

«Яндекс.Маркет»: в моем заказе вместо наушников оказалась бутылка из-под водки

Я давно хотела беспроводные наушники и наконец заказала себе Apple AirPods. Оформила заказ 15.10.2021 через Яндекс.Маркет в магазине Superbia.ru

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

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

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

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

Бизнес на опечатках: в 50-х секретарше надоело ошибаться в документах, она взбила краску в блендере и создала корректор Статьи редакции

Бетт Несмит Грэм хотела сохранить в тайне изобретение, но о нём узнали коллеги, и она стала продавать им по 100 флаконов в месяц. О создании первых партий корректора в гараже, продажах на миллионы долларов и борьбу за управление собственной компанией — в пересказе The Hustle.

Машинистки в 1950-х. За печатной машинкой работала и сама Грэм, которая создала корректор, чтобы исправлять ошибки CNBC
Travers – поиск инструкторов по активным видам спорта

Мы сделали второе приложение, раскатили сервис на всю Россию и изменили бизнес-модель. Многое благодаря пользователям vc.ru!

«Сбер» научил свой ИИ-сервис определять возможные признаки рака на ранних стадиях по снимкам лёгких Статьи редакции

Это может помочь врачам при диагностике заболевания.

null