Поиск файлов через командную строку, что полезно знать Начинающему.

В предыдущей статье, мы познакомились с достаточным списком команд для получения полной справочной информации в командной строке ОС ГНУ/Линукс. Однако, помимо потребности осмотреться и найти команды, полезным будет знание о том, какими командами в командной строке можно найти файлы, которые не являются программами, нужные самим нам, а не ОС ГНУ/Линукс. О таких, командах пойдет дальнейшая речь в данной статье.

Введение.

Все, кто задавался вопросом поиска информации в файлах, поиска самих файлов, никогда не задавался вопросом о том, как этот процесс реализован в ОС ГНУ/Линукс посредством командной строки, довольствуясь малым в плане графических инструментов. В том числе, привыкнув ко впихиванию всего подряд в плане поиска в одну команду. Также далеко не секрет, что каждая команда в ОС ГНУ/Линуксе выполняет свою задачу, однако полноту своих возможностей имеет достойную, нежели обычных графических средств, что является удобным, т.к. дает возможности специфического поиска, которые не встретив в ОС «Окна», т.к. якобы они там не нужны. Однако это не так, т.к. в любой системе бывает необходимость поиска специфичных файлов, а не только обычных к которым мы с вами привыкли (звук, видео, текст и т.д.). Что является полезным качеством, когда ОС ГНУ/Линукс может применяться сервером или вам нужно определиться с определенными вопросами, на которые вы не знаете точных определений по части файлов.  На все это, вам хватит трех команд, а это: locate, find, grep, о которых пойдет дальнейшая речь в этой статье.

Быстрый поиск по базе данных локальных файлов.

Быстрый поиск по базе данных локальных файлов производится командой «locate«, которая имеет версию себя «slocate«, которая является безопасной версией поиска, т.к. учитывает права доступа к файлам, однако реже всего мне встречалась в сборках для домашних компьютеров, так что в данном случае о ней упоминаться не будем, т.к. по параметрам она аналогично команде «locate«.

Если у вас такой команды нету, то вам достаточно на Debian и его производных установить пакет «mlocate«, на RedHat и его производных пакет «locate» (у меня оказалось оба пакета, разницы между ними в программе не нашел, видимо из разных хранилищ).

База данных периодически пополняется, чаще встречается что 1 раз в сутки, т.к. в «кронтабе» вызов обновления записан на ее ежедневное обновление. Если таковое не успеется выполнить в указанный срок (как правило в ночь), то запуск откладывается до следующего запуска системы. Программа работает быстро и незаметно, так что выключать эту задачу в «кронтабе» нет нужды. Однако, это периодичность может отличаться т.к. это прописывается в этом файле: «/etc/cron.dialy/mlocate» (или locate), в том числе запуск всех задач из директории «/etc/cron.dialy» запускается раз в сутки, что написано в файле «/etc/anacrontab«.

Однако, чтобы не ждать этого обновления раз в сутки, достаточно запустить команду «updatedb«, которую требуется запустить с правами администратора, чтобы она прошлась по всем местам. Работает она быстро, коли выводить ничего не надо на экран во время своей работы, что выполняется без параметров, иначе соизмеримо скорости вывода. Однако, в первый запуск после установки времени, она поработает дольше обычно, т.к. требуется составить новую базу данных. Например, у себя делаю, так.

По этой базе данных, команда «locate» ищет файлы, поиск происходит почти мгновенно, однако работа этой команды рассчитана на локальное применение, поэтому как правило искать по съемным дискам она не будет, в том числе и по другим папкам которые указаны в файле «/etc/updatedb.conf».

Где, каждая переменная означает свой момент. Например.

  • PRUNENAMES — указывает на список имен без полного пути, которые не должны сканироваться при обновлении базы данных.
  • PRUNEPATHS — указывает на список путей, которые не должны сканироваться при обновлении базы данных.
  • PRUNEFS — указывает на список файловых систем, которые не должны сканироваться при обновлении базы данных (имена файловых систем взяты из «/etc/mtab».
  • PRUNE_BIND_MOUNTS — указывает на то, пропускать ли монтируемые места сканирования (монтируемые системы), по умолчанию стоит «да» или «1». Так что, если у вас есть постоянный сетевой диск и команда его не читает, то проверьте этот параметр тоже поменяв его на «нет» или «0» (Однако не забывайте про остальные параметры в этом случае).

Как видите, в моем случае, данная команда не сканирует все монтируемые устройства в папку «/media«, однако рекомендуется  также добавлять директории «/var/tmp /var/cache /var/lock /var/run /mnt /run» в параметр «PRUNEPATHS«, чтобы убрать лишние директории от сканирования которых толку никакого, в том числе меньше нагрузки на ОС ГНУ/Линукс в том случае, когда у вас большое изменение файлов в системе. Однако, если у вас есть сомнения, что было правильное сканирование, то можно выполнить следующую команду, чтобы проверить работу обновления базы данных.

Чтобы отредактировать файл, вам нужно в консоли написать следующие.

Или

Вместо <имя редактора> напишите любой редактор (например, gedit, pluma, xed, nano), в котором будете производить изменения.

Теперь мы с вами знаем, как производится обновления базы данных для приведения ее в адекватное соответствие для быстрого поиска недавних изменений. А теперь, познакомимся с возможностями команды «locate«.

Чтобы применить команду «locate» в простом варианте, достаточно сделать следующие.

Например.

Однако, она будет показывать то, что доступно текущему логину. Так что, если требуется искать то, что требует администраторских прав, то лучше делать это с администраторскими правами, как это произвести показано на примере применения редактора для внесения изменений в файл конфигурации по тексту выше, а в статье будет показано без этого в дальнейшем по данной команде.

Когда требуется искать по ключевому слову без учета регистра букв (в том числе русских букв, проверено лично мною на своей сборке ОС ГНУ/Линукс), то достаточно ввести это следующим способом.

Например.

Если вам требуется узнать только количество найденных файлов, то  стоит написать так.

Например.

Если результатов поиска слишком много,  то достаточно сделать так.

Например.

Однако, лучше это делать так, чтобы не упускать из виду все результаты.

Учитывая, что команда «locate» ищет по базе данных, которую требуется периодически обновлять, т.к. она не обновляется автоматически по мере изменений файлов в системе, получается что она не всегда может выдать достоверный результат, который от нее ожидает любой Начинающий Линуксоид. Поэтому в начале подробно было рассмотрен конфигурационный файл обновления базы данных. Однако, по базе данных, можно проверить фактическое наличие существующего файла в файловой системе ОС ГНУ/Линукс, сделав это следующим образом.

Например.

Это в принципе все, что достаточно знать Начинающему по команде «locate«.

Обычный поиск файлов в командной строке ОС/ГНУ Линукс.

Команда «find» может искать разного рода файлы с учетом логики ОС ГНУ/Линукс по отношению к файлам, поэтому она удобна всем, что администраторам, веб-мастерам, обычным пользователям. Ее не так сложно научиться применять, в отличие от заблуждений которые вокруг нее надумали мушкоблуды не желающие ничего делать, кроме щелканий мышой. Однако, такие в здешних краях надолго не задерживаются, поэтому не будем заострять на них внимание, оставляю только ссылку на ранее написанную мною статью в данной рубрике. Так что, пойдем далее.

Команда «find» позволяет найти любой файл, который доступен по праву доступа к нему логину, от которого она запускает свое выполнение. Например.

Команду «find» можно запустить без параметров, однако это не рекомендуется т.к. будет напоминать команду «ls» с рекурсивным проходам по директориям, показывая скрытые файлы, но вывод будет не удобен для восприятия человеком, т.к. вывод результатов поиска будет чисто постраничным со всеми полными путями, пока команда полностью не пройдется по всем директориям начиная от исходной, в которой она была запущена. Поэтому, многим команда «find» кажется сложно, т.к. не работает с одного своего запуска и не принимает ключевое слово поиска после себя, все время ругаясь или показывая что-то другое, а не поиск.

Те кто из вас применял ОС ДОС поймут интересный момент работы, он в чем-то похож на досовскую команду «dir» (есть такая в Линуксе). Также команда «find» может дать знать есть ли такой файл, если ввести точно его имя и путь (полный или относительный). Все это и не знание того, как вывести справку или от получения краткой и мало понятной справки, приходят в разочарование от команды, потом возникает не желание искать по интернету и книгам описание этой команды, где все написано подробно и исчерпывающе для Начинающего Линуксоида. Т.о. начинающий пропускает основную команду поиска файлов, которая является краеугольным камнем поиска файлов в ОС ГНУ/Линукс. Т.к. она может искать блочные, символьные устройства или другие по типу файлы, может искать по правам доступа, регулировать глубину поиска, игнорировать регистр букв (в том числе русских букв), по правам доступа к файлам, по размеру, по времени обращения, по времени изменения, может начать поиск с самой большой глубины, исключать заданные каталоги из поиска, находить файлы созданные позже указанного файла, искать только пустые каталоги, в том числе удалять, а также выполнять над найденными файлами другую команду, также производить поиск по типу и группам логинов, в том числе искать по имени или регулярному выражению (последний вариант на уровне Начинающего не рассматривается), а также создавать логические параметры поиска (логическое или, и, не). Мало какая другая команда доступна в большинстве сборок ОС ГНУ/Линукс по поиску файлов столько может, поэтому знакомство с ней так важно.

Так что после ознакомления с перечнем возможностей, перейдем к ознакомлению с самими возможностями и начнем с наболевшего у всех Начинающих Линуксоидов, как искать по имени.

Если нужен поиск по имени без учета регистра, то этом случае применяется другой параметр.

Например.

Есть еще несколько параметров команды «find» начинающихся с «i«, однако страницы man, вам, в помощь, т.к. в предыдущей статье о том, как читать и переводить их вы уже прочитали, если нет, то рекомендую этим заняться перед дальнейшим продолжением (см. начало статьи).

Другой момент, набивший немалую оскомину у большинства Начинающих Линуксоидов — это поиск по всему компьютеру, т.к. Линукс отличается от Окон по праву доступа к файлам, то все набивают «дикое» количество шишок в попытке «дрессировать find, чтобы он прыгал через кольцо» (сам, когда-то занимался подобной ерундой в своих начинаниях, чего еще ждать от западнократического мышления). Не понимая, что права на доступ к разным файлам идет в том числе на файлы-директории, которые мы называем директориями, поэтому не мудрено, что обычный логин не может смотреть по всему компьютеру, т.к. ему оно не нужно в поисках нужных ему файлов. Все дело в том, что ОС ГНУ/Линукс всю информацию содержит в простых файлах (их еще называют плоскими), причем файлом может быть директория, жесткий диске, видеокарта, вебкамера, оперативная память и т.д. В том числе, в различных папках могут быть свои файловые системы, в которых присутствуют эти файлы, так что на эту часть никто из вас в большинстве своем не задавался вопросом о принадлежности папки к определенной файловой системе, т.к. там где хранятся ваши файлы — это файловые системы ext2/3/4, остальные директории вам не нужны для поиска, поэтому в них как нету доступа тем логинам, которые не состояет в группе логинов «root«, так нету смысла искать файлы, которые обычно ищутся обычным применителем. Так что нету ничего удивительного в таких неудачных попытках поиска, т.к. все это от недопонимания ОС ГНУ/Линукс. Т.к. чаще всего вы будете обращаться к следующим директориям, применяя команду «find«, а это: «/home«, «/opt«, «/var«, «/lib«, «/lib32«, «/lib64«, «/media«, «/mnt«, «/tmp«, «/usr«, «/srv«. В том числе стоит понимать полезными для начинающего будут, только: «/home«, «/var«, «/media«, «/usr«, «/srv» (эта директория полезна для веб-мастеров различных vps серверов). Т.к. другие директории реже всего вам пригодятся, скорее для специфичного поиска, когда будете разбирать ситуации с не нахождением программами каких-то библиотек или с файлами дополнительных программ, которых нету в хранилищах пакетов различных сборок ОС ГНУ/Линукс («/opt«) и т.д. Однако, если вам нужно произвести поиск на всем компьютере без исключений различных папок и т.п., то стоит выполнить следующие команды.

или

Например, я произвел у себя на настольном компьютере поиск всех файлов начиающихся с «cpu» по всему компьютеру, что могу счесть нормальной причиной подобного поиска, ради любопытства и интереса в изучении содержимого файловой системы, при этом поиск занял около 4-5 минут, с учетом что проходил по внешнему жесткому диску, который у меня подключен к компьютеру через директорию «/media«, где они всегда подключаются, впрочем как флешки дисководы и т.п., в том числе, у меня не было подключенний к сетевым дискам, которые обычно подключают к директории «/mnt«.

Рекомендую попробовать запустить у себя подобный пример и посмотреть, что у вас выйдет. Не удивляйтесь, что команда «find» будет «молчать» по части вывода результатов, т.к. она выводит то, что нашла во время своего поиска, а не после его завершения. С другой стороны она проходится по всем директориям включая директории внутри директорий, поэтому по началу складывается ложное впечатление «слишком долго не отвечает». Это нормальная работа, а чтобы вам было понятно почему, привожу свой вывод корневой директории у себя.

Что ж, самые наболевшие темы для Начинающего Линуксоида были разобраны, что требовалось было объяснено, теперь вкратце пройдемся по интересным параметрам для начинающего, в остальном интернет в помощь, благо примеров большое множество с различным объяснением, поэтому сильно подробно рассматривать не стану, дабы не перегружать восприятие начинающих излишеством информации для познавания.


Поиск файлов можно вести не только по имени, его можно вести по типу файлов, а это:

  • f — обычный файл;
  • d — директория;
  • l — символьная ссылка;
  • b — специальный файл блочного типа (жесткий диск и прочие блочные устройства);
  • c — специальный файль символьного типа (клавиатура, мышь, терминал, консоль и прочие символьные устройства).

Чтобы найти файлы по типу устройства, достаточно сделать следующие.

Например, вам потребовалось найти есть ли директория в нужной папке, но вы не знаете, как она называется и хотите вывести весь список директорий, чтобы самому ее увидеть и найти по памяти, то это делается таким способом, с учетом что уже находитесь в нужной вам папке для поиска.

Например, вам потребовалось найти все файлы блочных устройств, а вы не знаете где искать.

Аналогично, по отношению к файлам символьных устройств.

Или, например хочется узнать, какие символьные ссылки есть у вас в ОС ГНУ/Линукс.

Когда нужно искать по принадлежности к логину, который имеет к нему доступ или его создавал, то поиск стоит вести так.

Для поиска по группе логинов, достаточно сдлеать так.

Например, вам нужно найти все принадлежащие определенному логину, но их мог куда-то запихнуть по системе. В качестве примера, я у себя на компьютере создал логин «test«, которому создал несколько файлов с именем в виде наборов букв и цифр в домашней папке этого логина, а также в папке «/srv«, владельцем которого является логин «test«. Применив поиск, нашел следующие.

Аналогичный вывод получится, если применить поиск по данному логину, взяв его вкачестве имени группы логинов. Например, так можно искать по группе логинов «test«.

Поиск размеру файла, ведется следующим образом.

Стоит уделить внимание, <размер>, который обозначает размерность байтов деленных на 512 по умолчанию, а другие размерность, в том числе сами байты обозначаются, так:

  • b — 512-байтовые блоки (по умолчанию);
  • c — Байты;
  • k — Килобайты;
  • M — Мегабайты;
  • G — Гигабайты.

Символ «c» здесь пишется для байтов, потому что один символ равен одному байту, а символ «b» для блочных устройств, т.к. чаще всего блоки у них по 512 байт каждый. Это малое различие, которое лучше помнить в начале своего знакомства и осваивания командной строки ОС ГНУ/Линукс, чем игнорировать, т.к. оно может быть применимо не только для команды «find«, т.к. является нормальной системой обозначения размерности объема занимаемой памяти в Линукс и Юникс.

Например, вам нужно найти у себя файлы занимающие много места, например больше 1 ГБайт, для этого стоит выполнить следующую команду.

Если наоборот, меньше, то такую.

Например, у меня в директории «Видео» получился такой результат поиска.

Когда требуется искать файлы с изменениями, временем доступа или изменениями в свойствах, то достаточно применить следующие параметры, а это: mtime, atime, ctime. Первая ищет за указанное количество дней файлы с изменениями, вторая аналогично, только по доступу обращения, а третья понятное дело по части изменений в свойствах файла.

Например, я хочу уточнить к каким файлам в ОС ГНУ/Линукс обращался сегодня на своем внешнем жестком диске.

В первом применении вывелся результат обращения, у которого меньше 8 дней назад было обращение к файлу (если будет стоять «+», то больше 8 дней), а во втором применении обозначен сегодняшний день. Однако, стоит учитывать, что команда «find» сама изменяет дату обращения при поиске, как это обычно пишут в справочниках, однако при личном применении замечал, то это не так.

Как видите, эти параметры поиска полезны, когда вы не знаете имени файла, однако можете его вспомнить если увидите, и помните когда получали к нему последний раз доступ или меняли его содержание или свойства. Однако стоит учитывать, что обращения берутся те, которые происходили вообще, не важно вы это делали или кто-то другой, в том числе когда изменения производила программа работающая в фоне. Так что, сами по себе отдельно эти три параметра полезны, однако бывают моменты, когда нужны более конкретные параметры поиска сочетающие в себе несколько параметров, чтобы найти точнее и с меньшем кол-во лишнего в результатах поиска. Такое применение параметров в команде «find» является нормальной ситуацией применения, о чем речь дальше.

Для осуществления поиска по нескольким параметрам, требуется применять логические объединения параметров, через параметры «-a«, «-o«, «-n» (или «!«), которые обозначают логическое «И», «ИЛИ», «НЕ». Также условия поиска могут содержать экраннированые круглые скобки, работают аналогично круглым скобкам в математической логике ( «\(» и «\)«).

Например, требуется найти какой-то фильм формата mp4, который открывался примерно недели две назад, однако неизвестно, что это за файл по имени. Тогда делам это такой командой из собственной домашней папки.

Ага, нашелся фильм про Вещего Олега, который недавно смотрел. По ходу, видно что было обращение к другим файлам. Однако, когда у фильма по каким-то причинам нету разрешения, то искать уже надо другими подходами с определением типа файла и поиском по дате обращения, т.е. объединять команды. И еще один интересный момент в том, что при обращении к файлу и без его изменения или обычного открытия файла, допустим формата «pdf«, время обращения к нему не меняется. Чем это сделано, сказать не могу, однако это не самое удобное в этом плане. Т.к. при копировании, перемещении или изменении, дата обращения к файлу меняется. В остальном у файла видео, это время обращения меняется при каждом обращении к нему проигрывателя. Почему так, пока что выше моего понимания.

Так что, чтобы завершить сию часть по этой команде, покажу еще один пример, применения.

Допустим, я ищу файлы игры «Веснот» и знаю, что она написано как и читается на русском языке, в том числе известно, что она лежит в одной из директорий находящихся в директории «/usr«. Чтобы эти файлы через команду поиск, то делаю так.

Тем самым, нахожу все файлы в привычном для меня понимании, т.е. без директорий. Однако, у этой команды есть и приятные стороны, в которых она имеет практическое применение. Допустим нам нужно сделать вывод в надлежащей форме или произвести действия. Делается это через параметр «-exec«, однако в рамках статьи на уровне Начинающего я не буду ее полностью расписывать, так что предлагаю посмотреть на результат работы ниже.

В итоге, о команде «find«можно сказать, следующее. Эта команда позволяет вести классический поиск файлов с прохождением по всем директориям от исходного или указанного пути, в том числе она имеет достаточно множество параметров поиска, которые позволяют сделать поиск достаточно точным и конкретным. К тому же, эта команда полезна с технической стороны ее применения, т.к. позволяет удалять найденные команды или передавать список найденных файлов в качестве входного потока другим командам, которые она вызывает для исполнения. Также она может вызывать выполнение других команд по отношению результату поиска. В том числе, она позволяет искать файлы по типу, по имени, по времени доступа/изменения, по размеру, а также делать логические объединения для построения более сложных условий поиска, когда таковые требуются.

Также, в данной статье описаны не все возможности применения команды «find«, т.к. рассмотренны основные параметры, которые знать любому Начинающему Линуксоиду.

Поиск данных в файлах в ОС ГНУ/Линукс.

Команда «grep» применяется для поиска данных файлах, однако она может искать и во входящем потоке данных, но это уже относится к теме команды-фильтры, так что в данной статье рассматриваться не будет. Команда «grep» имеет простой вариант запуска.

Например, в следующем примере производится поиск ключевого слово, которое является моим логином, сам поиск ведется в директории «/etc«, которые хранят различные настройки в ОС ГНУ/Линукс.

Как видите, практическое применение команде «grep» сразу же нашлось, т.к. таким применением узнал достаточно интересного про свой логин. По сути и смыслу говоря в Линуксе эта та самая команда, которая отвечает за поиск данных в файлах. Однако, поиск в данном случае не учитывает вложенных каталогов, поэтому для полноты поиска, стоит применять команду «grep«, так.

Таким способом можно пройтись по всем вложенным директориям в месте поиска и сделать полный поиск данных во всех файлах. Например, повторим предыдущий пример, дополнив его новым параметром.

Как видите, вывод результат поиска стал короче. Это не удивительно, т.к. теперь она не выводит по каждому файлу, что он такое, т.к. смотрит все эти директории. Однако, пишет про отказ доступа, т.к. поиск велся обычным логином, а не администраторским. Например, ниже приведен вывод с полными правами администратора, того же примера.

Теперь мы получили полный поиск по всем директориям с доступам ко всем файлам и видим, где находится наш логин (для тех кто забыл, как себя определить, рекомендую прочесть это). Однако, частенько бывает полезным узнать в какой строке находится найденное, т.к. иногда без этого никак, для этого достаточно написать таким способом.

Например, повторим предыдущий пример, однако добавим новый параметр.

Достаточно сравнить оба примера и увидеть разницу в числах, которые появились между имени файла с полным путем и его найденным содержимым. Однако, это еще не все возможности этой команды, которые полезно знать Начинающему Линуксоиду.

Чтобы, найти слово без учета регистра букв в ключевом слове, стоит применить следующий параметр.

Например.

Однако стоит помнить, что все эти примеры содержат один недостаток в том, что они ищут любые вхождения ключевого слова в другие слова, поэтому когда требуется найти слово полностью совпадающее с ключевым словом, то надо применять так.

Например, добавим содержимое файла «test»в предыдущем примере и применим новый параметр.

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

или

Когда вводился параметр «A«, то показывалось после найденного, когда параметр «B» то, что было до найденного, параметр «C» показывал, что до, что после найденного, причем числа после этих параметров указывали количество строк требуемых для вывода, в случае с параметром «C» количество этих строки указывают, что до, что после, одним числом. Однако, когда результаты поиска находятся в некотором отдалении друг от друга, то команда добавляет две черточки, чтобы разграничить результаты поиска друг от друга, как это показано на примере ниже.

Также вести поиск данных в тех строках, которые исключают найденное выражение в самих себя. Однако это бывает полезно для технических надобностей.

Например, когда нужно узнать в каких группах логинов не состоит мой логин «andryuhan«.

Как видите, ничего сложно просто и понятно. Однако, большинству из нас хочется более простого вывода результата поисков, когда требуется только увидеть список файлов, в котором содержится искомое ключевое слово. Для этого достаточно применить следующий параметр.

Чтобы увидеть пример работы наглядным образом, добавлю этот параметр в один из первых параметров по данной команде.

Полагаю, данный результат работы показался многим из Начинающих Линуксоидов «знакомым», что не удивительно, т.к. бывают моменты, когда так получать результаты поиска удобней. И наконец, чтобы не получать «веретено» об неудачах в поиске или отказах в доступе, то достаточно применить параметр «-s«, например выполним один из первых примеров с большим количеством лишних сообщений с этим параметром.

Как видите, нет ничего сложного, чтобы добиться вывода без лишних диагностических сообщений, когда излишне «засоряют» вывод результатов поиска.

Всего, этого, достаточно для ознакомления с командой «grep» для Начинающего Линуксоида, чтобы смочь самостоятельно найти нужные ему данные в файлах. Есть конечно, возможность применения регулярных выражений, однако в пределах уровня Начинающего они рассматриваться не будут.

В заключение.

В данной статье, мы с вами ознакомились с тремя командами, которых хватает на различные потребности в поиске, как по времени, так и по универсальности и сложности условия поиска, в том числе по нахождении данных в файлах с различными запросами на вывод результатов поисках. Всего этого достаточно для Начинающего Линуксоида в командной строке ОС ГНУ/Линукс, чтобы найти то, что ищет в файлах и директориях. Однако, для поиска специфичной информации в ОС ГНУ/Линукс лучше применять специально предназначенные для этого команды, о которых будет речь в более поздних статья после того, как будут разобраны основы и азы работы с командной строкой ОС ГНУ/Линукс.

 

Loading