Заготовка программы
Прежде, чем копировать заготовку к себе, советую тыкнуть в Переключить отображение номеров строк
Чтобы вы могли в UNIX использовать скрипт без явного прописывания интерпретатора, нужно:
чтобы у скрипта была правильная первая строка (#!/usr/bin/python)
чтобы в скрипте переносы строк были UNIX-style (LF, он же \n), а не DOS/Windows-style (CR-LF, он же \r\n), (в UNIX это можно сделать так: sed -i 's/\r//' имя_скрипта.py)
сказать UNIX: chmod +x имя_скрипта.py
теперь скрипт можно запускать, например, так: ./имя_скрипта.py (если вы не выполнили пункты 1--3, или работаете в Windows, вы можете запускать его так: python имя_скрипта.py)
1 #!/usr/bin/python
2 """ A tool for sepulking.
3 """
4 import optparse
5 # import this
6 # ...
7
8 def main(options, args):
9 print("options.arg = %s" % options.arg)
10 print("options.flag = %s" % options.flag)
11 print("args = %s" % args)
12 print("Use sepulkarium!")
13
14 # def not_main():
15 # ...
16
17 if __name__ == "__main__":
18 parser = optparse.OptionParser(description=__doc__)
19 parser.add_option("-a", "--arg",
20 help="Option with argument")
21 parser.add_option("-f", "--flag", action="store_true",
22 help="Flag, i.e. an option without argument")
23 options, args = parser.parse_args()
24
25 main(options, args)
Задачи
Выберите себе не менее трёх задач на ваш вкус.
1: ``ls''
Создайте в репозитории скрипт ls.py.
Скрипт выводит имена всех файлов (и директорий) в текущей директории, кроме тех, которые начинаются с ".".
2: ``ls -- продолжение''
Добавьте к скрипту ls.py параметры командной строки (и соответствующую функциональность):
- -a / --all: выводить все имена файлов, включая те, которые начинаются с "."
- -s / --sort: выводить сначала директории, потом файлы; и те, и другие упорядочивать по алфавиту
3: ``find''
Создайте в репозитории скрипт find.py.
Скрипт выводит пути (относительно текущей директории) всех файлов (и директорий) в текущей директории, её поддиректориях, и так далее.
Пример:
$ mkdir a b a/b $ touch x.txt a/y.txt b.txt b/q.txt a/b/z.txt $ ../find.py a a/y.txt a/b a/b/z.txt b b/q.txt x.txt b.txt
Команда touch в данном случае используется для того, чтобы создавать пустые файлы. (Это, наверное, самое частое применение этой команды).
4: ``find -- продолжение''
Поправьте поведение find.py следующим образом:
Скрипт принимает в качестве позиционных параметров пути к директориям. Скрипт рекурсивно выводит пути всех файлов и директорий в каждой из директорий, заданных в позиционных параметрах. Скрипт выводит пути относительно текущей директории.
Пример:
$ mkdir a b a/b ../c $ touch x.txt a/y.txt b.txt b/q.txt a/b/z.txt ../c/hello.txt $ ../find.py a x.txt ../c a a/y.txt a/b a/b/z.txt x.txt ../c ../c/hello.txt
5: ``find -- продолжение''
Поправьте скрипт find.py. Сделайте так, чтобы он принимал параметры командной строки (и реализовал соответствующую функциональность):
- -n / --name=FNMATCH: выводить только те файлы, имя которых подходит под шаблон FNMATCH
-t / --type=TYPE: выводить только файлы типа TYPE. TYPE – это однобуквенная аббревиатура типа файла: d – директория, f – файл, l – ссылка.
6: ``Перенумератор''
Создайте в репозитории скрипт renumber.py, который принимает в качестве позиционных параметров имена файлов. Скрипт имеет один обязательный (именованный) параметр – шаблон. Скрипт переименовывает указанные ему файлы согласно шаблону, подставляя в шаблон порядковый номер файла в командной строке.
Скрипт принимает параметры:
- -f / --format=FORMAT: шаблон, согласно которому переименовываются файлы
Шаблон является printf-style шаблоном, т.е. шаблоном для операции % над строками. В шаблон передаётся один параметр – номер файла в командной строке.
Пример использования скрипта:
$ touch hello.txt a.x b.y $ ls hello.txt a.x b.y $ ../renumber.py -f file-%02d.txt * $ ls file-01.txt file-02.txt file-03.txt
Команда touch в данном случае используется для того, чтобы создавать пустые файлы. (Это, наверное, самое частое применение этой команды).
7: ``Перенумератор -- продолжение''
Задача состоит в том, чтобы улучшить скрипт renumber.py. Этот скрипт имеет опасное свойство: он может переписать новые файлы поверх существующих, и в некоторых случаях при (неумышленных) повторных запусках скрипта это может приводить к очень неприятным последствиям. Кроме того, если вы напутали с порядком параметров при вызове скрипта, то исправить эту ошибку становится очень трудно; было бы легче, если бы скрипт вёл протокол своих действий.
Более строгая постановка задачи.
Поправить скрипт таким образом, чтобы прежде, чем приступать к самому первому переименованию, он проверял, не существует ли какого-либо из файлов, которые он намерен создать. Если существует, скрипт сообщает об этом пользователю и прерывает своё выполнение с ненулевым статусом (например, exit(1)).
Добавить скрипту параметры командной строки и поправить соответствующим образом поведение скрипта:
- -r / --reverse: Нумеровать файлы с последнего, а не с первого
- -v / --verbose: Сопровождать каждое переименование сообщением на экран, что куда переименовывается
- -n / --noop: Выполнить проверки и, если требуется, вывести предстоящую последовательность переименований, но ничего не делать
- --force: Переписывать существующие файлы при переименовании
8: ``Умный распаковщик''
На kodomo (как и на всяком уважающем себя UNIX-компьютере) установлено много программ-упаковщиков: zip и unzip, rar и unrar, tar, bzip2, gzip, arj. Каждый из них имеет свой, по-своему странный интерфейс командной строки. Задача: написать скрипт, который будет по расширению файла определять, каким упаковщиком он запакован, и распаковать его.
Создайте в репозитории скрипт unpack.py, который принимает в качестве позиционных параметров имена файлов с архивами и распаковывает каждый из них.
Скрипт принимает флаги:
- -d / --mkdir: создать директорию с именем архива кроме расширения, распаковывать архив в неё
Чтобы разобраться, как работают упаковщики, читайте по ним документацию. (Например: man tar). Для простоты, привожу пример команд распаковки для каждой программы:
$ unzip pack.zip $ rar x pack.rar $ unrar pack.rar $ tar xf pack.tar $ tar xjf pack.tar.bz2 $ tar xzf pack.tar.gz $ bzip2 -dk file.bz2 $ gzip -cd file.gz > file
Так как я являюсь большим любителем командной строки и нелюбителем мыши, то примерно такой скрипт (разве самую чутоку похитрее) у меня всегда есть под рукой на каждом компьютере, где я работаю, и ради простоты использования носит название "x"; и такое короткое название оправдано тем, насколько часто он мне требуется. Полагаю, правда, что среди вас такой популярностью этот скрипт пользоваться не будет.