Введение
В этой лабораторной работе вы освоите ключевые навыки поиска файлов и команд в среде командной строки Linux. Вы начнете с мощного инструмента find, научитесь выполнять базовый поиск по имени и использовать подстановочные знаки для гибкого сопоставления шаблонов. Практический подход поможет вам создать структуру тестовых каталогов для безопасной отработки навыков поиска.
Опираясь на эту базу, вы изучите способы выполнения команд над результатами поиска с помощью -exec и xargs. Также в работе рассматриваются альтернативные и специализированные инструменты поиска, включая быструю команду locate, работающую на основе базы данных, whereis для поиска исполняемых файлов и руководств, а также утилиты alias, which и type для анализа пути выполнения команд. К концу занятия вы научитесь безошибочно выбирать подходящий инструмент для любой задачи по поиску файлов или команд в Linux.
Базовый поиск файлов с помощью find и подстановочных знаков
На этом этапе вы познакомитесь с командой find — одним из самых мощных инструментов командной строки Linux для поиска файлов и каталогов. Мы начнем с простого поиска по имени и добавим подстановочные знаки для поиска по шаблонам.
Для начала создадим специальный каталог и несколько тестовых файлов. Это обеспечит контролируемую среду, где мы сможем увидеть работу find, не затрагивая другие части файловой системы.
- Убедитесь, что вы находитесь в правильном начальном каталоге. Вся работа в этой лаборатории будет выполняться внутри
~/project.
cd ~/project
- Создайте новый каталог с именем
find_labи перейдите в него.
mkdir find_lab
cd find_lab
- Теперь создадим набор файлов и подкаталог для поиска. Мы воспользуемся командой
touchдля создания пустых файлов иmkdirдля создания каталога.
touch file1.txt file2.log report.txt File1.TXT
mkdir subdir
touch subdir/file3.txt subdir/another.log
Проверить структуру можно с помощью команды ls -R, которая рекурсивно выводит список файлов в текущем каталоге и его подкаталогах.
ls -R
Вы должны увидеть примерно такой результат:
.:
File1.TXT file1.txt file2.log report.txt subdir
./subdir:
another.log file3.txt
Теперь, когда тестовая среда готова, приступим к поиску.
Базовый синтаксис команды find выглядит так: find [путь] [выражение]. [путь] указывает, где начинать поиск, а [выражение] определяет критерии поиска.
Поиск по точному имени файла
Чтобы найти файл по его точному имени, используйте выражение -name. Давайте найдем файл report.txt. В качестве пути укажем . (точку), что велит find искать в текущем каталоге.
find . -name "report.txt"
В выводе отобразится путь к найденному файлу:
./report.txt
Поиск с использованием подстановочных знаков
Подстановочные знаки позволяют искать файлы по шаблонам. Самый распространенный знак — звездочка (*), которая соответствует любой последовательности символов.
Рекомендуется заключать шаблон в двойные кавычки ("), чтобы оболочка (shell) не интерпретировала подстановочный знак до того, как его обработает команда find.
Найдем все файлы с расширением .txt.
find . -name "*.txt"
find выполнит рекурсивный поиск в текущем каталоге (.) и всех его подкаталогах:
./file1.txt
./report.txt
./subdir/file3.txt
Обратите внимание, что файл File1.TXT не был найден, так как параметр -name чувствителен к регистру. Для поиска без учета регистра используйте параметр -iname (insensitive name).
find . -iname "*.txt"
Теперь в результатах присутствуют все файлы, заканчивающиеся на .txt, независимо от регистра:
./file1.txt
./report.txt
./File1.TXT
./subdir/file3.txt
Поиск по типу файла
Вы также можете указать find искать только определенные объекты файловой системы, например, только файлы или только каталоги, используя параметр -type. Используйте -type f для обычных файлов и -type d для каталогов.
Давайте найдем только каталоги в нашем текущем местоположении.
find . -type d
Вывод покажет текущий каталог (.) и созданный нами subdir:
.
./subdir
Вы можете комбинировать выражения для более точного поиска. Например, чтобы найти все файлы (не каталоги), чьи имена заканчиваются на .log:
find . -type f -name "*.log"
Эта команда найдет все объекты, которые являются файлами И имеют имя, заканчивающееся на .log.
./file2.log
./subdir/another.log
Вы освоили основы использования find с шаблонами имен и фильтрами по типу. На следующих этапах мы изучим более продвинутые возможности этой команды.
Выполнение действий над результатами поиска с помощью find -exec и xargs
На этом этапе вы пойдете дальше простого вывода списка файлов. Вы научитесь запускать команды непосредственно для файлов, найденных командой find. Это мощный метод для выполнения массовых операций, таких как изменение прав доступа, удаление файлов или запуск пользовательских скриптов. Мы рассмотрим два основных способа: опцию -exec команды find и команду xargs.
Мы продолжим работу в каталоге ~/project/find_lab. Сначала убедитесь, что вы находитесь в нем.
cd ~/project/find_lab
Использование find -exec
Опция -exec позволяет запустить произвольную команду для каждого найденного файла. Синтаксис поначалу может показаться необычным:
find [путь] [выражение] -exec [команда] {} \;
[команда]: Команда, которую вы хотите выполнить (например,ls -l,rm,chmod).{}: Специальный заполнитель (плейсхолдер).findзаменяет{}полным путем к текущему найденному файлу.\;: Обязательный завершающий символ для команды-exec. Обратная косая черта (\) необходима, чтобы оболочка не интерпретировала точку с запятой как спецсимвол завершения строки.
Попробуем на практике. Найдем все файлы с расширением .txt и выполним ls -l для каждого из них, чтобы увидеть подробную информацию.
find . -name "*.txt" -exec ls -l {} \;
Вывод покажет результат выполнения ls -l для каждого найденного .txt файла:
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./file1.txt
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./report.txt
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./subdir/file3.txt
Для безопасности в find предусмотрена опция -ok. Она работает точно так же, как -exec, но запрашивает подтверждение перед выполнением команды для каждого файла. Это настоятельно рекомендуется при выполнении деструктивных операций, таких как удаление файлов (rm).
Попробуем удалить созданные ранее .log файлы, используя -ok для безопасности.
find . -name "*.log" -ok rm {} \;
Для каждого найденного файла find запросит подтверждение. Введите y и нажмите Enter, чтобы подтвердить удаление.
< rm ... ./file2.log > ? y
< rm ... ./subdir/another.log > ? y
После подтверждения вы можете убедиться, что файлы удалены, просмотрев содержимое каталога.
ls -R
.:
File1.TXT file1.txt report.txt subdir
./subdir:
file3.txt
Использование xargs
Альтернативой -exec является передача вывода find по конвейеру (pipe) команде xargs. xargs считывает элементы из стандартного ввода (пути к файлам, предоставленные find) и выполняет указанную команду, используя эти элементы в качестве аргументов.
Главное преимущество xargs — эффективность. В то время как -exec ... \; запускает команду отдельно для каждого файла, xargs группирует пути к файлам и запускает команду меньшее количество раз, передавая ей сразу много аргументов.
Сначала восстановим лог-файлы, которые мы только что удалили.
touch file2.log subdir/another.log
Теперь используем find и xargs, чтобы вывести сведения о наших .log файлах.
find . -name "*.log" | xargs ls -l
Результат похож на пример с -exec, но структура команды иная:
-rw-r--r-- 1 labex labex 0 <date> <time> ./file2.log
-rw-r--r-- 1 labex labex 0 <date> <time> ./subdir/another.log
Как и у find -ok, у xargs есть режим подтверждения с помощью опции -p. Команда покажет, что она собирается выполнить, и запросит ваше согласие.
Используем это, чтобы снова удалить .log файлы.
find . -name "*.log" | xargs -p rm
xargs сгруппирует файлы в одну команду rm и попросит подтверждения. Введите y и нажмите Enter.
rm ./file2.log ./subdir/another.log ?...y
Вы успешно освоили использование -exec и xargs для обработки результатов поиска, что является фундаментальным навыком для автоматизации задач в Linux.
Использование locate и updatedb для быстрого поиска по базе данных
На этом этапе вы познакомитесь с альтернативой find под названием locate. В то время как find сканирует файловую систему в реальном времени, locate ищет в заранее созданной базе данных путей файлов. Это делает locate значительно быстрее, но с важным нюансом: команда может найти только те файлы, которые существовали на момент последнего обновления базы данных.
Мы продолжим работу в каталоге ~/project. Сначала убедимся, что необходимые инструменты установлены.
- Команда
locateпредоставляется пакетомmlocate, который может быть не установлен по умолчанию. Выполните следующую команду, чтобы обновить список пакетов и установить его. Используйтеsudo, так как это системная установка.
sudo apt-get update && sudo apt-get install -y mlocate
Вы увидите процесс установки пакета, это нормально.
- Теперь перейдите в наш тестовый каталог.
cd ~/project/find_lab
- Попробуйте найти файл
report.txtс помощьюlocate.
locate report.txt
Во многих системах база данных locate обновляется автоматически, поэтому вы можете увидеть файл сразу:
/home/labex/project/find_lab/report.txt
Если путь к файлу отобразился, значит, база данных уже содержит информацию о ваших недавно созданных файлах. Это происходит, когда система автоматически запускает обновление базы в фоновом режиме.
- Если на шаге 3 вы не увидели вывода, базу данных нужно обновить вручную. Используйте команду
updatedbдля пересборки базы:
sudo updatedb
Эта команда не выводит текст, но работает в фоновом режиме. Ее выполнение может занять несколько секунд.
- После запуска
updatedb(если это потребовалось) попробуйте снова выполнить поиск:
locate report.txt
Теперь путь к файлу должен быть найден и отображен:
/home/labex/project/find_lab/report.txt
Понимание ограничений локальной базы данных
Давайте посмотрим, что произойдет, если создать новые файлы после последнего обновления базы данных.
- Создайте новый файл в каталоге
find_lab.
touch special_report.pdf
- Попробуйте найти этот новый файл:
locate special_report.pdf
Если системная база данных была обновлена совсем недавно, вы можете увидеть файл. Если нет — вывода не будет, так как база данных еще не знает об этом файле.
- Вы можете принудительно обновить системную базу данных:
sudo updatedb
- Теперь попробуйте найти файл снова:
locate special_report.pdf
Теперь вы должны увидеть:
/home/labex/project/find_lab/special_report.pdf
Частота обновления базы данных
Главный вывод заключается в том, что locate зависит от актуальности своей базы данных. В рабочих системах:
- Система обычно обновляет базу
locateавтоматически (часто ежедневно через задания cron). - Вы можете обновить ее вручную с помощью
sudo updatedb, если вам нужны немедленные результаты. locateработает чрезвычайно быстро, так как ищет по готовому индексу, а не сканирует диски.- Для поиска файлов, созданных только что,
findможет быть надежнее, так как работает в реальном времени.
Вы узнали, как locate обеспечивает молниеносный поиск с помощью базы данных, и поняли важность поддержания этой базы в актуальном состоянии с помощью updatedb.
Поиск исполняемых файлов и руководств с помощью whereis
На этом этапе вы научитесь использовать whereis — специализированную команду для поиска исполняемых файлов (бинарников), исходных кодов и страниц руководств (man) для конкретной команды. В отличие от find или locate, предназначенных для общего поиска файлов, whereis оптимизирована для быстрого нахождения основных файлов, связанных с системной командой. Она ищет в предопределенном списке стандартных каталогов Linux, что делает ее очень быстрой.
Начнем изучение whereis. Для этого можно находиться в любом каталоге, так как whereis не выполняет поиск относительно вашего текущего местоположения. Останемся в ~/project для единообразия.
cd ~/project
- Найдем местоположение команды
passwd, которая используется для смены паролей пользователей.
whereis passwd
Вывод покажет имя команды, а затем пути к ее исполняемому файлу и связанным страницам руководства.
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
/usr/bin/passwd: Это исполняемая программа./etc/passwd: Это системный файл базы данных пользователей, с которым взаимодействует командаpasswd.whereisчасто включает важные конфигурационные файлы в результаты./usr/share/man/...: Это сжатые страницы руководства для данной команды.
- Вы можете отфильтровать результаты, чтобы увидеть только определенные типы файлов. Чтобы увидеть только исполняемые файлы, связанные с
passwd, используйте флаг-b(binary).
whereis -b passwd
Это сузит вывод до исполняемого файла и связанных системных файлов, исключая руководства.
passwd: /usr/bin/passwd /etc/passwd
- Аналогично, чтобы найти только страницы руководств, используйте флаг
-m(manual). Это полезно, когда вы хотите узнать, какая документация доступна для команды.
whereis -m passwd
Теперь в списке будут только пути к man-страницам.
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
- Важно понимать ограничения
whereis. Она ищет только в стандартных системных каталогах. Попробуем найти файлreport.txt, который мы создали в каталогеfind_lab.
whereis report.txt
Команда вернет только имя файла без пути:
report.txt:
Это происходит потому, что report.txt находится в вашем домашнем каталоге (~/project/find_lab), который не является стандартным местом для системных программ или руководств. Это демонстрирует ключевое различие: используйте find или locate для личных или проектных файлов, и whereis для исследования системных команд.
Вы научились использовать whereis для быстрого поиска компонентов команд Linux, что является полезным навыком для системного администрирования и устранения неполадок.
Анализ путей команд с помощью alias, which и type
На этом заключительном этапе мы изучим, как оболочка определяет, какую именно команду выполнить, когда вы вводите ее имя. Это не всегда так просто, как поиск файла на диске. У оболочки есть определенный порядок приоритетов: сначала она проверяет псевдонимы (aliases), затем встроенные команды оболочки, и только в последнюю очередь ищет исполняемый файл в каталогах, перечисленных в системной переменной $PATH. Вы научитесь создавать сокращения с помощью alias, а также использовать which и type для диагностики того, на что на самом деле указывает имя команды.
Начнем с создания временного псевдонима, чтобы увидеть, как он влияет на выполнение команд. Мы останемся в каталоге ~/project.
- Псевдоним (alias) — это определяемое пользователем сокращение для другой команды. Создадим псевдоним, который заставит команду
pwd(вывод текущего рабочего каталога) вместо этого выполнять командуdate.
alias pwd='date'
- Теперь выполните команду
pwd.
pwd
Вместо вывода пути к каталогу она выведет текущую дату и время, так как псевдоним имеет приоритет.
<текущая дата и время>
Исследование с помощью which и type
Представьте, что вы не знали о существовании этого псевдонима. Как понять, почему pwd ведет себя странно? Здесь на помощь приходят which и type.
- Команда
whichнаходит исполняемый файл в каталогах, перечисленных в переменной окружения$PATH.
which pwd
Вывод покажет:
pwd: aliased to date
- Команда
typeболее универсальна. Это встроенная команда оболочки, которая описывает, как именно shell интерпретирует имя команды, включая псевдонимы и встроенные функции.
type pwd
Эта команда точно определит ситуацию:
pwd is an alias for date
- Чтобы увидеть все возможные варианты команд, соответствующие имени, можно использовать флаг
-a(all). Это особенно эффективно с командойtype.
type -a pwd
Это раскроет всю иерархию для имени pwd:
pwd is an alias for date
pwd is a shell builtin
pwd is /usr/bin/pwd
pwd is /bin/pwd
Этот вывод объясняет порядок предпочтений оболочки: сначала будет использован псевдоним. Если бы псевдонима не было, использовалась бы встроенная в оболочку команда pwd. Если бы не было и ее, выполнилась бы программа, расположенная по пути /usr/bin/pwd.
Удаление псевдонима
В завершение наведем порядок и удалим наш псевдоним.
- Команда
unaliasудаляет определение псевдонима из текущей сессии оболочки.
unalias pwd
- Теперь снова запустите
pwdиtype pwd, чтобы убедиться, что все вернулось в норму.
pwd
Вывод:
/home/labex/project
type pwd
Вывод:
pwd is a shell builtin
Вы научились создавать и удалять псевдонимы и, что более важно, использовать which и type, чтобы точно понимать, какую команду выполнит оболочка.
Резюме
В этой лабораторной работе вы научились искать файлы и каталоги в файловой системе Linux. Вы начали с мощной команды find, используя критерии по имени и подстановочные знаки для базового поиска, а затем перешли к выполнению команд над результатами поиска с помощью -exec и xargs. Вы также изучили команду locate как более быструю альтернативу на основе базы данных и узнали, как обновлять эту базу с помощью updatedb.
Кроме того, в работе были рассмотрены методы поиска и анализа самих команд. Вы использовали whereis для поиска исполняемых файлов и страниц руководств. Чтобы понять путь выполнения команды, вы научились использовать which для идентификации конкретного вызываемого файла и type для определения того, является ли команда псевдонимом, встроенной функцией или файлом, попутно анализируя влияние псевдонимов на поведение системы.



