Учебная страница курса биоинформатики,
год поступления 2023
Ответы к упражнениям
Здесь можно подсмотреть, как правильно выполнять упражнения по мнению преподавателей (по крайней мере некоторых ). Даже если справились со всем самостоятельно, не помешает сверить ваши решения с предложенными.
Специальные символы
#1
$ mkdir ~/term1/pr4
$ cd ~/term1/pr4
#2
$ mkdir a
$ cp -t a /P/y23/term1/Tab-and-Arrows_are_your_friends/*a*
#3
$ echo a/*a*a*
a/alanine a/asparagine a/aspartate a/glutamate a/phenylalanine
-- есть 5 файлов, содержащих более одной a в коротком имени
#4
$ echo a/*nine
a/alanine a/arginine a/phenylalanine
$ rm a/*nine
#5
$ mkdir you
$ cp -t you /P/y23/term1/Tab-and-Arrows_are_your_friends/*[you]*
#6
$ echo /P/y23/term1/Tab-and-Arrows_are_your_friends/[r-z]*
/P/y23/term1/Tab-and-Arrows_are_your_friends/selenocysteine /P/y23/term1/Tab-and-Arrows_are_your_friends/serine /P/y23/term1/Tab-and-Arrows_are_your_friends/threonine /P/y23/term1/Tab-and-Arrows_are_your_friends/tryptophan /P/y23/term1/Tab-and-Arrows_are_your_friends/tyrosine /P/y23/term1/Tab-and-Arrows_are_your_friends/valine
-- так сложно считать
$ ls -1 /P/y23/term1/Tab-and-Arrows_are_your_friends/[r-z]*
/P/y23/term1/Tab-and-Arrows_are_your_friends/selenocysteine
/P/y23/term1/Tab-and-Arrows_are_your_friends/serine
/P/y23/term1/Tab-and-Arrows_are_your_friends/threonine
/P/y23/term1/Tab-and-Arrows_are_your_friends/tryptophan
/P/y23/term1/Tab-and-Arrows_are_your_friends/tyrosine
/P/y23/term1/Tab-and-Arrows_are_your_friends/valine
-- так проще, 6 файлов
$ basename -a /P/y23/term1/Tab-and-Arrows_are_your_friends/[r-z]*
selenocysteine
serine
threonine
tryptophan
tyrosine
valine
-- а так еще и понятнее, полезно знать всякие программы
#7
$ echo you/*a?a*
you/glutamate you/phenylalanine
-- есть два файла c одним символом между двумя a в имени
$ echo you/*a??a*
you/*a??a*
-- а с двумя нет, маска остается без изменения, если нет подходящих файлов
#8
$ ls -1 /P/y23/term1/name_your_file_in_english_and_without_spaces/?
/P/y23/term1/name_your_file_in_english_and_without_spaces/B
/P/y23/term1/name_your_file_in_english_and_without_spaces/K
/P/y23/term1/name_your_file_in_english_and_without_spaces/L
-- три файла
$ ls -1 /P/y23/term1/name_your_file_in_english_and_without_spaces/??
ls: cannot access '/P/y23/term1/name_your_file_in_english_and_without_spaces/??': No such file or directory
-- нет файлов
$ ls -1 /P/y23/term1/name_your_file_in_english_and_without_spaces/???
/P/y23/term1/name_your_file_in_english_and_without_spaces/AJT
/P/y23/term1/name_your_file_in_english_and_without_spaces/AXT
-- два файла
#9
$ ls -1 /P/y23/term1/name_your_file_in_english_and_without_spaces/*[0-9]
/P/y23/term1/name_your_file_in_english_and_without_spaces/230928_exp1rep0
/P/y23/term1/name_your_file_in_english_and_without_spaces/230928_exp1rep3
/P/y23/term1/name_your_file_in_english_and_without_spaces/230928_exp1rep4
/P/y23/term1/name_your_file_in_english_and_without_spaces/230928_exp1rep5
-- четыре файла
$ ls -1 /P/y23/term1/name_your_file_in_english_and_without_spaces/*[0-9][0-9]
ls: cannot access '/P/y23/term1/name_your_file_in_english_and_without_spaces/*[0-9][0-9]': No such file or directory
#10
$ cp you/glycine 'you/???cine'
$ cp you/glycine 'you/gl*e'
#11
$ mkdir strange
$ mv -t strange 'you/???cine'
$ mv -t strange 'you/gl*e'
-- не забываем экранировать специальные символы!
$ echo strange/*
strange/???cine strange/gl*e
#12
$ cp strange/gl\*e strange/gl\'ycin\'e
$ mv strange/gl\*e strange/gl\'\*\'e
$ echo strange/*
strange/???cine strange/gl'*'e strange/gl'ycin'e
#13
$ cp -t strange /P/y23/term1/Tab-and-Arrows_are_your_friends/gl* /P/y23/term1/Tab-and-Arrows_are_your_friends/asp*
-- где можно указать одну маску (которая потенциально заменится на произвольное число аргументов)
-- можно указать сколько угодно масок, так ведь?
#14
$ rm */g*e
#15
$ rm */*
$ rmdir *
#16
$ echo cp a{1,2,3}m
cp a1m a2m a3m
-- четыре аргумента
$ echo cp {a..f}
cp a b c d e f
-- в отличие от масок, подстановка фигурных скобок не проверяет наличия файлов
$ echo cp {a..f}{1,2,3}
cp a1 a2 a3 b1 b2 b3 c1 c2 c3 d1 d2 d3 e1 e2 e3 f1 f2 f3
-- если в аргументе несколько фигурных скобок, то выдаются все варианты раскрытий
-- на самом деле, можно даже вложенные фигурные скобки использовать
#17
$ cd
$ echo *
Desktop Downloads public_html term1
-- а где все скрытые?
$ echo * .*
Desktop Downloads public_html term1 . .. .bash_history .bash_logout .bashrc .cache .config .dmrc .gnupg .ICEauthority .lesshst .local .mozilla .nv .pki .profile .ssh .viminfo .Xauthority .xsession-errors .xsession-errors.old
-- одной маской обойтись не получится
-- в файловых масках точку в начале короткого имени надо указывать явно
-- (чтобы обычные маски не цепляли скрытые файлы)
$ echo .??*
.bash_history .bash_logout .bashrc .cache .config .dmrc .gnupg .ICEauthority .lesshst .local .mozilla .nv .pki .profile .ssh .viminfo .Xauthority .xsession-errors .xsession-errors.old
-- явная точка в начале, потом два любых символа, а дальше что угодно
Редактирование в терминале
В nano используются следующие обозначения: ^ значит Ctrl, M- значит Meta (но такой клавиши обычно нет, вместо нее работает Alt или Esc), Sh- значит Shift, Bsc – Backspace и т.д. Заглавные буквы всегда означают просто нажатие на соответствующую клавишу без Shift. Если требуется Shift, то это указано явно.
В меню сохранения файла есть два "переключателя" формата переносов строк: M-D (Alt+d) для формата DOS, т.е. двумя байтами CRLF; M-M (Alt+m) для устаревшего формата Mac, т.е. одним байтом CR. Переключатель (toggle) означает, что первое нажатие изменяет формат на требуемый, а последующее возвращает на формат по-умолчанию. Формат по умолчанию – Unix, т.е. одним символом LF. Если при сохранении будет использован формат, отличный от Unix, то это указывается в квадратных скобках перед окошком ввода имени файла.
Программа file для текстовых файлов перечисляет все встреченные в нем варианты переносов строк, если только в файле не использован формат Unix. В этом случае про концы строк не указывается ничего.
$ file file1.txt
file1.txt: UTF-8 Unicode text
-- нормальный текстовый файл в кодировке utf-8
$ file file2.txt
file2.txt: ASCII text
-- нормальный текстовый файл в кодировке ascii
$ file file3.txt
file3.txt: ASCII test, with CRLF, CR, LF line terminators
-- а бывает и такое, если кто-то надругался над файлом
-- в нем встречаются все 3 типа переносов
Удаленное копирование
Если у вас есть доступ к какому-то компьютеру по SSH, то, как правило, доступны еще протоколы удаленного копирования файлов SFTP и SCP. Для работы с этими протоколами в Windows 10 и всех современных Unix-подобных системах существуют встроенные консольные клиенты sftp и scp.
sftp – это интерактивная программа. После её запуска вы окажетесь в сеансе связи по SFTP. Вам будут доступны команды для перемещения одновременно на удаленной и локальной машинах (cd и lcd), для определения текущей папки (pwd и lpwd) и получения списка файлов (ls и lls). И главное, в вашем распоряжении команды put и get. Первая позволяет скопировать файл из текущей папки на локальном компьютере в текущую папку на удаленном, а вторая – в обратном направлении. Для выхода из сеанса SFTP предусмотрена команда exit (или quit, или bye, это синонимы). А команда help выводит список доступных команд с кратким описанием.
scp работает по аналогии с cp (т.е. неинтерактивно), но понимает дополнительный вид имен файлов – имена на удаленных машинах. Пример: user@host.na.me:file1 – путь к файлу file1, который лежит в домашней папке пользователя user на удаленной машине с доменным именем domain.na.me. В качестве имени файла можно указывать любой путь относительно домашней папки пользователя, или абсолютный путь к файлу (тогда сразу после : будет /). Совет: не пытайтесь скопировать файл с одной удаленной машины на другую удаленную машину (т.е. использовать расширенный синтаксис имени файла сразу и в качестве SOURCE, и в качестве DEST). В теории это возможно, но только при подключении по SSH в режиме без паролей, а вы так не умеете.
Советую попробовать обе программы и выбрать подход, который вам ближе. Самое важное при использовании sftp и scp – определиться, на каком из компьютеров их запускать! Помните, что вам нужна возможность подключения к удаленному компьютеру по SSH. Поэтому вы не сможете скопировать файл на kodomo со своего домашнего компьютера, запустив программу на kodomo. У вашего компьютера, скорее всего, нет доменного имени (или публичного IP), и на вашем компьютере не запущен SSH-сервер, необходимый для подключения. Поэтому для копирования файла с домашнего компьютера на kodomo запускать sftp/scp нужно на домашнем компьютере, а не на kodomo.
В программах sftp и scp для указания порта используется опция -P (а не -p, как у ssh). Это можно узнать, просмотрев соответствующие справочные страницы в системе man.
#1
kodomo:~$ sftp -P 22221 testuser@copytest.fbb.www
testuser@copytest.fbb.www's password:
Connected to copytest.fbb.www.
sftp> pwd
Remote working directory: /home/testuser
sftp> lpwd
Local working directory: /home/students/y23/test23
#2
sftp> get /folder/file.txt ~/term1/pr4
Fetching /folder/file.txt to ~/term1/pr4
Couldn't open local file "~/term1/pr4" for writing: No such file or directory
-- sftp не понимает тильду!
sftp> get /folder/file.txt term1/pr4
Fetching /folder/file.txt to term1/pr4/file.txt
/folder/file.txt 100% 415 2.5KB/s 00:00
sftp> exit
kodomo:~$ file ~/term1/pr4/file.txt
/home/students/y23/test23/term1/pr4/file.txt: UTF-8 Unicode text, with CRLF, LF line terminators
-- с переносами в файле явно беда
#3
kodomo:~$ nano term1/pr4/file.txt
-- исправляем
-- Ctrl+o -> Alt+d -> Enter -> Ctrl+x
kodomo:~$ file term1/pr4/file.txt
term1/pr4/file.txt: UTF-8 Unicode text
-- вот теперь все OK
#4
kodomo:~$ sftp -P 22221 testuser@copytest.fbb.www
testuser@copytest.fbb.www's password:
Connected to copytest.fbb.www.
sftp> put term1/pr4/file.txt /temp/test23
sftp> ls /temp
/temp/test23
sftp> exit
kodomo:~$