Почему команда find ведет себя таким образом?

Вопрос или проблема

Вот вывод терминала:

paul@cube:~$ find / libhwinfo_cpu.so
...
/home/paul/hwinfo/build/lib/libhwinfo_cpu.so
...
find: ‘libhwinfo_cpu.so’: Нет такого файла или каталога
paul@cube:~$ sudo find / -name libhwinfo_cpu.so
find: ‘/run/user/1000/doc’: Доступ запрещен
find: ‘/run/user/1000/gvfs’: Доступ запрещен
/home/paul/hwinfo/build/lib/libhwinfo_cpu.so

Почему первый вызов find утверждает, что libhwinfo_cpu.so не существует?

В первом вызове вы указываете как /, так и libhwinfo_cpu.so в качестве путей для поиска. Последний путь является относительным, поэтому это действительно означает “поиск в ~/libhwinfo_cpu.so“, которого действительно не существует.

Во втором вызове вы добавляете -name, таким образом, вы указываете только / в качестве пути для поиска и -name libhwinfo_cpu.so как условие для поиска. Поскольку это больше не путь, а только имя для сравнения, ошибки не возникает.

Ответ или решение

Команда find в Unix-подобных системах используется для поиска файлов и каталогов по заданным критериям. Однако, иногда поведение команды может вызывать вопросы, особенно если вывод не совпадает с ожидаемым результатом. Рассмотрим, почему в первом вызове команды find отмечается, что файл libhwinfo_cpu.so не существует, тогда как во втором вызове его нахождение подтверждается.

Первое использование find

Ваша команда:

find / libhwinfo_cpu.so

здесь / обозначает корневой каталог, а libhwinfo_cpu.so интерпретируется как относительный путь. Это означает, что команда find будет искать в директории / и в директории ~/libhwinfo_cpu.so. Так как ~/ — это сокращение для домашнего каталога текущего пользователя (в данном случае /home/paul), фактически команда ищет в следующих путях:

  1. /
  2. /home/paul/libhwinfo_cpu.so

Если файла по пути /home/paul/libhwinfo_cpu.so не существует, команда выдает сообщение об отсутствии файла:

find: ‘libhwinfo_cpu.so’: No such file or directory

Второе использование find

Во втором вызове используется команда:

sudo find / -name libhwinfo_cpu.so

Здесь добавлен параметр -name, который изменяет поведение команды. Опция -name указывает find искать файл только по имени, начиная с указанного пути. В данном случае, корневой каталог / становится единственным местом поиска.

В таком контексте команда будет искать файл libhwinfo_cpu.so по всему файловому дереву начиная с корневого каталога, игнорируя наличие (или отсутствие) других путей с именем файла. Это объясняет, почему ошибки о несуществующих директориях не появляются, если файл найден.

Разбор ОСОшибок

При выполнении второй команды, вы также видите сообщения об ошибках, например:

find: ‘/run/user/1000/doc’: Permission denied

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

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...