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

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

Введение.

Все, кто задавался вопросом поиска информации в файлах, поиска самих файлов, никогда не задавался вопросом о том, как этот процесс реализован в ОС ГНУ/Линукс посредством командной строки, довольствуясь малым в плане графических инструментов. В том числе, привыкнув ко впихиванию всего подряд в плане поиска в одну команду. Также далеко не секрет, что каждая команда в ОС ГНУ/Линуксе выполняет свою задачу, однако полноту своих возможностей имеет достойную, нежели обычных графических средств, что является удобным, т.к. дает возможности специфического поиска, которые не встретив в ОС «Окна», т.к. якобы они там не нужны. Однако это не так, т.к. в любой системе бывает необходимость поиска специфичных файлов, а не только обычных к которым мы с вами привыкли (звук, видео, текст и т.д.). Что является полезным качеством, когда ОС ГНУ/Линукс может применяться сервером или вам нужно определиться с определенными вопросами, на которые вы не знаете точных определений по части файлов.  На все это, вам хватит трех команд, а это: 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«.