Другое

Подавление сообщений 'Permission Denied' в команде find

Узнайте, как исключить сообщения 'permission denied' из вывода команды find. Изучите несколько методов, включая перенаправление stderr и фильтрацию grep для более чистого списка файлов.

Как исключить все сообщения “permission denied” из команды “find”?

Мне нужно скрыть все сообщения “permission denied” из вывода команды:

find . > files_and_folders

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

Самые эффективные способы исключения сообщений “Permission denied” из команды find - это перенаправление stderr в /dev/null (find . > files_and_folders 2>/dev/null) или использование grep для фильтрации этих конкретных ошибок (find . 2>&1 | grep -v "Permission denied" > files_and_folders). Первый метод скрывает все сообщения об ошибках, в то время как второй нацелен именно на сообщения об отказе в доступе.

Содержание

Понимание проблемы

При запуске команды find без соответствующих прав она генерирует сообщения об ошибках “Permission denied”, которые появляются в выводе. Эти сообщения возникают, когда команда find пытается получить доступ к каталогам или файлам, для которых у вашей учетной записи нет прав на чтение.

Стандартная команда find . > files_and_folders отправляет как обычный вывод (stdout), так и сообщения об ошибках (stderr) в выходной файл. Чтобы подавить только сообщения об отказе в доступе, необходимо понимать, как Unix/Linux обрабатывает различные потоки вывода.

Стандартный поток ошибок (stderr) представлен дескриптором файла 2, в то время как стандартный вывод (stdout) - дескриптором файла 1. Это различие имеет решающее значение для правильной обработки ошибок.

Метод 1: Перенаправление всех ошибок в /dev/null

Самый простой подход - перенаправить весь вывод stderr в /dev/null, который отбрасывает все сообщения об ошибках:

bash
find . > files_and_folders 2>/dev/null

Как это работает:

  • > перенаправляет stdout в файл
  • 2>/dev/null перенаправляет stderr (дескриптор файла 2) в нулевое устройство
  • Все сообщения об отказе в доступе отбрасываются

Плюсы:

  • Просто и легко запомнить
  • Работает последовательно на всех системах Unix/Linux
  • Удаляет все сообщения об ошибках, а не только об отказе в доступе

Минусы:

  • Скрывает ВСЕ сообщения об ошибках, потенциально пропуская другие важные проблемы
  • Вы не увидите другие типы ошибок, которые могут быть релевантны

Когда использовать:

  • Вы абсолютно не хотите видеть никаких сообщений об ошибках
  • Вас интересуют только успешные совпадения
  • Вы запускаете команду с привилегиями root в любом случае

Метод 2: Фильтрация конкретных сообщений с помощью grep

Более целенаправленный подход использует grep для специфической фильтрации строк, содержащих “Permission denied”:

bash
find . 2>&1 | grep -v "Permission denied" > files_and_folders

Как это работает:

  • 2>&1 перенаправляет stderr в stdout, так что оба потока объединяются
  • | передает объединенный вывод в grep
  • grep -v "Permission denied" исключает строки, содержащие эту фразу
  • > перенаправляет отфильтрованный вывод в ваш файл

Плюсы:

  • Подавляет только сообщения об отказе в доступе
  • Сохраняет другие сообщения об ошибках, которые могут быть полезны
  • Более точная обработка ошибок

Минусы:

  • Немного более сложный синтаксис
  • Работает только если сообщение об ошибке содержит именно “Permission denied”
  • Может не уловить вариации, такие как “Access denied” в некоторых системах

Когда использовать:

  • Вы хотите видеть другие типы ошибок
  • Вам нужно целенаправленно фильтровать сообщения об отказе в доступе
  • Вы работаете с локализованными сообщениями об ошибках

Метод 3: Расширенная обработка ошибок

Для более сложной обработки ошибок можно использовать манипуляцию с дескрипторами файлов:

bash
(find . 2>&1 | grep -v "Permission denied") > files_and_folders 2>&1

Как это работает:

  • Команда find запускается с перенаправлением stderr в stdout
  • grep фильтрует сообщения об отказе в доступе
  • Весь отфильтрованный вывод идет в ваш файл
  • Любые оставшиеся ошибки (если они есть) обрабатываются отдельно

Плюсы:

  • Более надежная обработка ошибок
  • Лучшее разделение ответственности
  • Может быть расширен для более сложной фильтрации

Минусы:

  • Более сложный синтаксис
  • Может быть избыточным для простых случаев использования
  • Труднее запомнить и напечатать

Когда использовать:

  • Вам нужна очень точная обработка ошибок
  • Вы создаете сложные скрипты оболочки
  • Вам нужно обрабатывать разные типы ошибок по-разному

Метод 4: Использование 2>&1 для фильтрации через pipe

Синтаксис 2>&1 имеет решающее значение при использовании pipe, так как pipe по умолчанию обрабатывают только stdout:

bash
find . 2>&1 | grep -v "Permission denied" > files_and_folders

Как объясняется в ответе на Stack Overflow, “При использовании pipe следует помнить, что только стандартный вывод отправляется на вход другой команды, поэтому необходимо перенаправить stderr в stdout, а затем отправить stdout (2>&1).”

Почему это необходимо:

  • Без 2>&1 stderr все равно пойдет на ваш терминал
  • Только stdout будет передан в grep
  • Сообщения об отказе в доступе все равно появятся на экране

Практические примеры

Пример 1: Простое подавление сообщений об отказе в доступе

bash
find /var/log -name "*.log" 2>/dev/null > log_files.txt

Пример 2: Фильтрация конкретных сообщений об отказе в доступе

bash
find /home -name "*.txt" 2>&1 | grep -v "Permission denied" > text_files.txt

Пример 3: Работа с локализованными сообщениями

Если ваша система использует локализованные сообщения об ошибках, может потребоваться сначала установить локаль:

bash
LC_ALL=C find / -name "config*" 2>&1 | grep -v "Permission denied" > config_files.txt

Пример 4: Комбинирование с другими опциями find

bash
find . -type f -name "*.conf" 2>&1 | grep -v "Permission denied" > config_files.txt

Выбор правильного подхода

Метод Лучше всего подходит Сложность Точность
2>/dev/null Полная тишина по всем ошибкам Низкая Низкая
`2>&1 grep -v` Целенаправленная фильтрация отказов в доступе Средняя
Расширенная манипуляция с FD Сложные скрипты Высокая Высокая
LC_ALL=C + фильтрация Локализованные системы Средняя Средняя

Рекомендация: В большинстве случаев начинайте с find . > files_and_folders 2>/dev/null, если вам нужна абсолютная тишина, или с find . 2>&1 | grep -v "Permission denied" > files_and_folders, если вы хотите сохранить другие сообщения об ошибках.

Помните, что эти методы работают, потому что Unix/Linux разделяет стандартный вывод (stdout) от стандартного потока ошибок (stderr), позволяя обрабатывать их независимо. Команда find отправляет успешные совпадения в stdout, а ошибки - в stderr, что делает эти методы перенаправления эффективными.

Источники

  1. Linux / Unix Find Command Avoid Permission Denied Messages - nixCraft
  2. How can I exclude all “permission denied” messages from “find”? - Stack Overflow
  3. How to skip “permission denied” errors when running find in Linux - Unix & Linux Stack Exchange
  4. Exclude “Permission denied” Messages in find Command Output - Baeldung on Linux
  5. How to suppress warning or error messages in find command - Xmodulo
  6. Ignore permission denied message from find command in Linux - Bobcares

Заключение

  • Самый простой способ подавить ошибки отказа в доступе - использование 2>/dev/null, которое перенаправляет весь stderr в /dev/null
  • Для более целенаправленной фильтрации используйте 2>&1 | grep -v "Permission denied", чтобы сохранить другие сообщения об ошибках
  • Помните, что pipe по умолчанию обрабатывают только stdout, поэтому 2>&1 необходимо при фильтрации с помощью grep
  • Выбирайте метод в зависимости от того, вам нужна абсолютная тишина или целенаправленная фильтрация ошибок
  • Эти техники работают на всех Unix-подобных системах, включая Linux, macOS и варианты BSD

Понимая, как stdout и stderr работают в Unix/Linux, вы можете эффективно контролировать, что появляется в ваших выходных файлах, сохраняя при этом видимость важной системной информации.

Авторы
Проверено модерацией
Модерация