diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b25c15b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*~ diff --git a/01_bash/solutions.md b/01_bash/solutions.md new file mode 100644 index 0000000..a8a3bf8 --- /dev/null +++ b/01_bash/solutions.md @@ -0,0 +1,146 @@ +# Решения + +# 1 +Вы в директории /home/stud/data. Какая из команд переместит вас в домашнюю директорию? + +3 cd /home/stud +5 cd ~ +8 cd +9 cd .. + +# 2 +Создайте файл dummy в /tmp. Попробуйте удалить его указав флаг -i для команды rm. В чём отличие удаления файла с этим флагом и без него? + +mkdir /tmp/dummy + +rm -r -i /tmp/dummy +rm: remove directory '/tmp/dummy'? y + +rm -r /tmp/dummy + +Отличие в запросе подтверждения действия. + +# 3 +Создайте папку backup в домашней директории. Одновременно скопируйте файл .bashrc в /tmp/ и в backup с помощью cp. + +$ mkdir ~/backup +$ cp .bashrc ~/backup; cp .bashrc /tmp/ + +# 4 +Повторите структуру директории: + +mkdir project +cd project +mkdir .git +mkdir data +mkdir raw +cd raw +touch 2022-07-23-exp1.log +touch 2022-08-03-exp2.log +touch 2022-11-23-exp3.log +touch 2022-07-23-exp1.dat +touch 2022-08-03-exp2.dat +touch 2022-08-03-exp2-calibration.dat +touch 2022-11-23-exp3.dat +touch 2022-11-23-exp3-calibration.dat +cd ../ +mkdir backup +mkdir shared + +# 5 +Скопируйте файлы экспериментов в backup, но распределите по папкам разные типы файлов. .data в backup/dataset, dat-calibration в backup/calibration, логи в backup/logs. В shared поместите все файлы, созданные 23 числа в папку 23day. Напишите команды в двух вариантах: с относительными путями и с абсолютными. + +cd backup +mkdir dataset calibration logs +cp ./raw/*-exp?.dat backup/dataset/ +cp ./raw/*-exp?-calibration.dat backup/calibration +cp ./raw/*.log ./backup/logs/ + +export PD=/home/stud/project +mkdir $PD/backup/dataset $PD/backup/calibration $PD/backup/logs +cp $PD/raw/*-exp?.dat backup/dataset/ +cp $PD/raw/*-exp?-calibration.dat backup/calibration +cp $PD/raw/*.log ./backup/logs/ + +# 6 +Посчитайте количество строк в файле /var/log/messages. + +sudo wc -l /var/log/messages + +sudo cat /var/log/messages | wc -l + +# 7 +Инициализируйте файл head_tail_messages с помощью команды head из строк в /var/log/messages, затем добавьте в head_tail_messages последние 23 строки из /var/log/messages. + +sudo head /var/log/messages > head_tail_messages +sudo tail -n 23 /var/log/messages >> head_tail_messages + +# 8 +Создайте псевдоним "dc", который разрешается в команду "cd" для случаев опечатки. + +alias dc=”cd” + +# 9 +Прочитайте мануал `man ls` и напишите `ls` команду, которая выводит список файлов в следующем виде: + +* список файлов включает скрытые, +* размер файла указан с метрическими приставками (e.g. 454M вместо 454279954), +* файлы выводятся в историческом порядке, +* вывод в цвете. + +ls -caht или ls -cahtl + +# 10 +Запишите в переменную среды PATH значение "". Как это повлияло на выполнение команд? Перезайдите по ssh и попробуйте вызывать любую команду заново. Сохранились ли изменения? + +export PATH=”” +следствие: ни один исполняемый файл системой теперь не находится +после переподключения система вернулась в прежнее состояние + +# 11 +Модифицируйте команду так, чтобы у директорий в начале названия присутствовал глобальный индекс idx. + +idx=0; +for species in cubane ethane methane; +do + for temperature in 25 30 37 40; + do + mkdir $idx-$species-$temperature; + ((idx+=1)); + done +done + +idx=-1; for species in cubane ethane methane; do for temperature in 25 30 37 40; do mkdir $idx-$species-$temperature; ((idx+=1)); done; done + +# 12 +(*) Напишите команду или сценарий для рекурсивного поиска самого последнего измененного файла в каталоге. В общем, можете ли вы перечислить все файлы по давности? + +Плохое решение +ls -Rlht + +Лучше +find ./ -type f -printf "%T+ %H%P\n" 2>/dev/null | sort -r +где +%T+ - время последнего изменения в формате 2004-04-28+22:22:05.0, +%H - путь к директории, в которой файл найден, +%P - имя файла. + +# 13 +Напишите цикл, который проходит по списку файлов в текущей директории и выводит полный путь к директории и имя файла. + +for f in $(ls); do echo $(pwd)/$f; done + +# 14 +Выведите результат сложения 10 и 4 с помощью bash синтаксиса для арифметических операций. + +echo $((10 + 4)) + +# 15 +Выведите результат умножения двух переменных с помощью bash синтаксиса для арифметических операций. + +a=1; b=2; echo $((a*b)) + +# 16 +Напишите команду, которая рекурсивно находит все HTML-файлы в папке и запаковывает их в tar.gz архив. Ваша команда должна работать, даже если в файлах есть пробелы. + +find . -type f -name "*.html" -print0 | xargs -0 tar cfz htmls.tar.gz diff --git a/01_bash/tasks.md b/01_bash/tasks.md new file mode 100644 index 0000000..7f54d23 --- /dev/null +++ b/01_bash/tasks.md @@ -0,0 +1,99 @@ +# Задания + +# 1 +Вы в директории /home/stud/data. Какая из команд переместит вас в домашнюю директорию? + +1 cd . +2 cd / +3 cd /home/stud +4 cd ../.. +5 cd ~ +6 cd home +7 cd ~/data/.. +8 cd +9 cd .. + +# 2 +Создайте файл dummy в /tmp. Попробуйте удалить его указав флаг -i для команды rm. В чём отличие удаления файла с этим флагом и без него? + +# 3 +Создайте папку backup в домашней директории. Одновременно скопируйте файл .bashrc в /tmp/ и в backup с помощью cp. + +# 4 +Повторите структуру директории: + +project/ +├── .git +├── data + └── raw + ├── 2022-07-23-exp1.log + ├── 2022-08-03-exp2.log + ├── 2022-11-23-exp3.log + ├── 2022-07-23-exp1.dat + ├── 2022-08-03-exp2.dat + ├── 2022-08-03-exp2-calibration.dat + ├── 2022-11-23-exp3.dat + └── 2022-11-23-exp3-calibration.dat +├── backup +└── shared + +# 5 +Скопируйте файлы экспериментов в backup, но распределите по папкам разные типы файлов. .data в backup/dataset, dat-calibration в backup/calibration, логи в backup/logs. В shared поместите все файлы, созданные 23 числа в папку 23day. Напишите команды в двух вариантах: с относительными путями и с абсолютными. + +# 6 +Посчитайте количество строк в файле /var/log/messages. + +# 7 +Инициализируйте файл head_tail_messages с помощью команды head из строк в /var/log/messages, затем добавьте в head_tail_messages последние 23 строки из /var/log/messages. + +# 8 +Создайте псевдоним "dc", который разрешается в команду "cd" для случаев опечатки. + +# 9 +Прочитайте мануал `man ls` и напишите `ls` команду, которая выводит список файлов в следующем виде: + +* список файлов включает скрытые, +* размер файла указан с метрическими приставками (e.g. 454M вместо 454279954), +* файлы выводятся в историческом порядке, +* вывод в цвете. + +Пример, того как он должен выглядеть + +``` +-rw-r--r-- 1 user group 1.1M Jan 14 09:53 baz +drwxr-xr-x 5 user group 160 Jan 14 09:53 . +-rw-r--r-- 1 user group 514 Jan 14 06:42 bar +-rw-r--r-- 1 user group 106M Jan 13 12:12 foo +drwx------+ 47 user group 1.5K Jan 12 18:08 .. +``` + +# 10 +Запишите в переменную среды PATH значение "". Как это повлияло на выполнение команд? Перезайдите по ssh и попробуйте вызывать любую команду заново. Сохранилиcь ли изменения? + +# 11 +Выполните в терминале следующую команду в директории /tmp: + +for species in cubane ethane methane; +do + for temperature in 25 30 37 40; + do + mkdir $species-$temperature; + done +done + +Что в результате вы получили в консоли? Модифицируйте команду так, чтобы у директорий в начале названия присутствовал глобальный индекс idx. + +# 12 +(*) Напишите команду или сценарий для рекурсивного поиска самого последнего измененного файла в каталоге. В общем, можете ли вы перечислить все файлы по давности? + +# 13 +Напишите цикл, который проходит по списку файлов в текущей директории и выводит полный путь к директории и имя файла. + +# 14 +Выведите результат сложения 10 и 4 с помощью bash синтаксиса для арифметических операций. + +# 15 +Выведите результат умножения двух переменных с помощью bash синтаксиса для арифметических операций. + +# 16 +Напишите команду, которая рекурсивно находит все HTML-файлы в папке и упаковывает их в tar.gz архив. Используйте find и xargs. Ваша команда должна работать, даже если в файлах есть пробелы (подсказка: используйте null разделитель).