Kodomo

Пользователь

Заготовка программы

(!) Прежде, чем копировать заготовку к себе, советую тыкнуть в Переключить отображение номеров строк

(!) Чтобы вы могли в UNIX использовать скрипт без явного прописывания интерпретатора, нужно:

  1. чтобы у скрипта была правильная первая строка (#!/usr/bin/python)

  2. чтобы в скрипте переносы строк были UNIX-style (LF, он же \n), а не DOS/Windows-style (CR-LF, он же \r\n), (в UNIX это можно сделать так: sed -i 's/\r//' имя_скрипта.py)

  3. сказать UNIX: chmod +x имя_скрипта.py

  4. теперь скрипт можно запускать, например, так: ./имя_скрипта.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 параметры командной строки (и соответствующую функциональность):

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. Сделайте так, чтобы он принимал параметры командной строки (и реализовал соответствующую функциональность):

6: ``Перенумератор''

Создайте в репозитории скрипт renumber.py, который принимает в качестве позиционных параметров имена файлов. Скрипт имеет один обязательный (именованный) параметр – шаблон. Скрипт переименовывает указанные ему файлы согласно шаблону, подставляя в шаблон порядковый номер файла в командной строке.

Скрипт принимает параметры:

Шаблон является 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)).

Добавить скрипту параметры командной строки и поправить соответствующим образом поведение скрипта:

8: ``Умный распаковщик''

На kodomo (как и на всяком уважающем себя UNIX-компьютере) установлено много программ-упаковщиков: zip и unzip, rar и unrar, tar, bzip2, gzip, arj. Каждый из них имеет свой, по-своему странный интерфейс командной строки. Задача: написать скрипт, который будет по расширению файла определять, каким упаковщиком он запакован, и распаковать его.

Создайте в репозитории скрипт unpack.py, который принимает в качестве позиционных параметров имена файлов с архивами и распаковывает каждый из них.

Скрипт принимает флаги:

Чтобы разобраться, как работают упаковщики, читайте по ним документацию. (Например: 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

План