Поиск сотен гигабайт данных и тысяч папок — задача не из легких, если только вы не прочтёте эту статью, которая посвятит Вас в это и раскроет некоторые «секреты» по быстрому поиску файлов.
Большинство дистрибутивов сегодня имеют в комплекте инструмент поиска на рабочем столе, который поможет вам быстро найти нужные файлы. Это невероятно полезно при огромном дисковом пространстве и постоянно растущем количестве хранимых файлов и каталогов. Но для пользователей CLI всегда существовало несколько надежных инструментов для быстрого поиска файлов. Главным из них является Find.
Как следует из названия, утилита Find стремится помочь вам найти файлы. Что отличает ее от других? Возможность идентифицировать файлы не только по именам файлов. При поиске файлов вы можете использовать различные параметры, такие как имя, приблизительное имя, разрешения, последнее изменение, тип файла и так далее, чтобы быстро найти нужный файл, который вы ищете. Вы также можете ограничить результаты каталогами, и даже найти файлы по их содержимому. В целом, Find — это один из самых полезных инструментов для всех, кто работает в CLI.
В отличие от большинства инструментов CLI, описанных в этой колонке, утилита Find уже является частью вашего дистрибутива Linux, поэтому вам не нужно беспокоиться об её установке. На самом деле, она является частью пакета findutils, который включает в себя четыре надежных CLI-утилиты: Find, Locate, Xargs и Updatedb. Проверьте во врезке для получения дополнительной информации о findutils.
ДРУГИЕ УТИЛИТЫХотя утилита Find не имеет себе равных в поиске файлов, существуют другие утилиты CLI для поиска файлов и даже исполняемых двоичных файлов. Раз уж мы заговорили о поиске файлов, вам стоит попробовать еще одну утилиту — Locate. Она быстрее, чем Find, выдает результаты. Это потому, что в отличие от Find, который выполняет поиск в реальном времени, Locate работает, находя в своей базе данных заданное ключевое слово. Базу данных можно обновить вручную, выполнив команду Недостатком Locate является то, что он не может выдать результаты по файлам, которые были созданы с момента последнего обновления базы данных. Аналогично можно использовать команду $ which cargo /usr/bin/cargo $ whereis cargo cargo: /usr/bin/cargo /usr/share/cargo /usr/share/man/man1/cargo.1.gz |
Хранители искателя
Разве вы не ненавидите, когда вы помните название файла, который ищете, но не можете вспомнить, куда его поместили? Такую ситуацию легко исправить с помощью Find.
Она предполагает, что вы хотите искать в текущем рабочем каталоге, если каталог не указан. Вы также можете использовать ряд тестов и опций для определения файла или каталога, который вы ищете, что полезно, если вы хотите сузить круг поиска. Например, вы можете использовать опцию -type f
при поиске файлов, или -type d
, если хотите искать только каталоги. В следующей таблице перечислены некоторые общие операции, которые можно использовать для ограничения результатов поиска.
Тип файла | Описание |
-type f | Ограничивает результаты только файлами |
-type d | Ограничивает результаты только каталогами |
-type l | Ограничивает результаты только символическими ссылками |
Если в имени искомого файла есть слово ‘foo’, вы можете выполнить команду find ~/Documents -type f -name "*foo.odt"
, которая рекурсивно просмотрит каталог ~/Documents в поисках всех ODT-файлов, соответствующих заданному подстановочному символу. При необходимости вы также можете использовать подстановочные знаки вместо расширения файла. Шаблон поиска всегда должен быть заключен в кавычки, и если вы не используете подстановочные знаки, Find возвращает только те результаты, которые точно соответствуют заданному ключевому слову. Например, если есть несколько файлов с именами LXF-285-foo.txt, LXF-286-bear.txt и так далее, команда find -type f -name "LXF"
не даст никаких результатов, потому что не существует файла с именем ‘LXF’. Чтобы найти все подходящие результаты, вам нужно искать "LXF*"
.
В наших примерах параметр -name
— это всего лишь один из тестов поддерживаемых Find, чтобы помочь вам сузить поиск.
Тесты Find | Объяснение |
-name <pattern> | Выполняет поиск с учетом регистра для <pattern> |
-iname <pattern> | Выполняет поиск без учета регистра для <pattern>. |
-size n | Совпадение с файлами размером n |
-size +n | Совпадение с файлами больше размера n |
-size -n | Ищет файлы размером меньше n |
-newer <file> | Ищет файлы и каталоги, содержимое которых было изменено позднее, чем указанный файл. |
-mmin n | Ищет файлы или каталоги, содержимое которых было изменено n минут назад. |
-mtime n | Искать файлы или каталоги, содержимое которых было изменено n*24 часа назад |
-atime n | Искать файлы, к которым последний раз обращались n*24 часа назад. |
-perm <permission> | Искать файлы с определенным разрешением |
Полный список тестов см. на странице man. При использовании теста -size
вы можете указать размер в байтах ( c
), килобайтах ( k
), мегабайтах ( M
) или гигабайтах ( G
). На самом деле, на странице руководства используются термины кикибайты, мегабайты и гигабайты, но они обычно используются взаимозаменяемо с более привычными названиями размеров файлов.
Тест -mtime n
используется для определения файлов или каталогов, которые последний раз были изменены n*24 часа назад. Таким образом, -mtime 1
определяет файлы или каталоги, которые были последний раз были изменены день назад, в то время как -mtime 2
ограничит результаты теми, которые были изменены два дня назад.
$ find ~/Desktop/ -mtime 1 /home/linuxlala/Desktop/ /home/linuxlala/Desktop/Bare Acts /home/linuxlala/Desktop/notes-applications-arguments.pdf $ find -mtime 15 ./Arbitration/HC-13-Zexus-vs-AR-Airways/complaint.docx ./Arbitration/HC-13-Zexus-vs-AR-Airways/HC-Reply-Zexus.docx
Вы также можете использовать логические операторы, такие как and
, or
и not
для объединения тестов, чтобы лучше контролировать результаты поиска. Например, если вам нужны файлы, соответствующие шаблону ‘foo’, но размером менее 2 МБ, вам придется выполнить команду find -name "*foo*" -and -size -2M
. Здесь мы используем логический оператор -and
, чтобы разделить два теста, которые хотим использовать: -name
и -size
.
Оператор | Описание |
-and / -a | Выдает результаты, соответствующие тестам с обеих сторон оператора |
-or / -o | Выдает результаты, соответствующие одному из тестов |
-note /! | Выдает результаты, которые не соответствуют тесту |
() | Может использоваться для группировки тестов и операторов для создания сложных выражений |
При использовании () для объединения тестов, вы должны не забыть снять (\) скобки. Кроме того, вы должны оставить пробел после открывающей и непосредственно перед закрывающей скобками. |
В следующем примере показано, как можно использовать несколько тестов и комбинаций операторов, чтобы сузить искомый файл:
$ ls HC-somename.pdf HC-somen.jpg HHhHcC-somename.jpg $ find \( -iname “*HC*” -size +2M \) -and -not \( -iname “*.jpg” -or -iname “*.png” \) ./HC-somename.pdf
В этом примере нам нужны файлы, в названии которых есть буквы ‘hc’ в названии, в верхнем регистре или нет и чтобы размер файла превышал 2 МБ, но не являлись файлами изображений.
Выполняем действия
Существует ряд операций, которые вы можете выполнить над файлами, которые находит Find. По умолчанию вывести на экран все совпадающие файлы или каталоги.
Но вы также можете удалить файл с помощью команды -delete
. Например, команда find -f -name "*HC*" -delete
удаляет все файлы, которые соответствуют заданному шаблону.
Следует быть крайне осторожным при использовании действия -delete
в Find, поскольку утилита не запрашивает подтверждения перед тем, как приступить к удалению совпадающих файлов.
Также можно запускать различные команды для всех совпадающих файлов. Например, если у вас есть несколько скриптов оболочки, которые вы хотите пометить как исполняемые, то вполне можете объединить find
с chmod
, чтобы выполнить эту операцию с помощью одной команды. Команда find -type f -name '*.sh' -exec chmod +x {} \;
может быть использована для идентификации всех сценариев оболочки и назначения их исполняемыми. Вы можете аналогичным образом комбинировать find
с командой chmod
для изменения прав доступа к соответствующим файлам, а также различные другие команды для упрощения ваших задач.