-
Необходимо поддержать команды для работы с каталогами:
- pwd -- выводит текущую рабочую директорию
- cd <dir> -- меняет текущую рабочую директорию на указанную. Работает как с абсолютными, так и с относительными путями
- mkdir <name> -- создает новую директорию с заданным именем в текущей рабочей директории. Если директория с таким именем уже существовала, выводит "cannot create directory 'name': file exists".
- ls [<dir>] -- выводит список всех файлов в указанной директории (или в текущей рабочей директории, если dir не указан), в алфавитном порядке
-
Команды cat <file1> [<file2>, <file3>, ...] и tac <file, [<file2>, <file3>, ...] выводящие содержимое указанных файлов в прямом и обратном порядке соответственно.
-
Поддержать перенаправление вывода команд: операторы > и >>
-
Наконец, реализовать команду grep "<pattern>" <file>, выводящую все строки из файла, в которых встречается указанный паттерн. Для простоты будем считать, что pattern задается корректным регулярным выражением Python. Кроме того команда может принимать следующие дополнительные аргументы:
-c
-- означает, что вместо вывода самих строк необходимо вывести количество строк в файле, подходящее под заданный паттерн.-r
-- означает, что необходимо искать подходящие строки в файлах рекурсивно.- При указании этого аргумента вместо file можно передать в качестве последнего аргумента директорию, которую необходимо рекурсивно (включая поддиректории) просканировать. В таком случае в качестве отчета команда должно возвращать список пар вида <путь>:<строка> из пути до файла, где нашлось совпадение и подходящей строки. Обходить директории и файлы нужно в алфавитном порядке.
- Если при указании
-r
не была указана директория, то начинать поиск с текущей директории. - Если при указании
-r
вместо директории был указан файл, то-r
игнорируется.
- аргументы
-c
-r
можно указывать одновременно и в любом порядке.
Вам необходимо реализовать функцию solution(script: TextIO, output: TextIO) -> None
в файле shell.py
, которая принимает на вход два уже открытых файла для входных и выходных данных.
В первом файле script записана последовательность команд (по одной на строчку), которые нужно выполнить в вашем shell-е.
В выходной файл output нужно записать последовательный вывод всех выполненных команд (в случае, если их вывод не перенаправлялся в файл с помощью > или >>). Вывод каждой следующей команды начинается с новой строки.
изначальная структура каталогов | input | output |
---|---|---|
. |
mkdir test cd test cd .. ls mkdir test2 ls |
dir1 some_text_file.txt test dir1 some_text_file.txt test test2 |
. Содержимое файлов: some_text_file.txt: just some text another_text_file.txt: and some more text and even more |
cat ./some_text_file.txt ./dir1/dir2/another_text_file.txt > result.txt tac result.txt ls |
and even more just some text and some more text dir1 result.txt some_text_file.txt |
.Содержимое файла some_text_file.txt: this is a text with some words we need to get only strings with word text in it so, not this one |
grep "text" some_text_file.txt | this is a text with some words word text in it |
.Содержимое файла some_text_file.txt: this is a text with some numbers: 42 we need to get only strings with them 123 224 1122 |
grep "\d+" test/some_text_file.txt grep -c "\d+" test/some_text_file.txt |
this is a text with some numbers: 42 123 224 1122 3 |
.Содержимое файлов: another_text_file.txt: and some more text and even more some_text_file.txt: just some text |
grep -r "text" grep -r -c "text" |
another_text_file.txt:and some more text some_text_file.txt:just some text another_text_file.txt:1 some_text_file.txt:1 |