Подавление сообщений '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). Первый метод скрывает все сообщения об ошибках, в то время как второй нацелен именно на сообщения об отказе в доступе.
Содержание
- Понимание проблемы
- Метод 1: Перенаправление всех ошибок в /dev/null
- Метод 2: Фильтрация конкретных сообщений с помощью grep
- Метод 3: Расширенная обработка ошибок
- Метод 4: Использование 2>&1 для фильтрации через pipe
- Практические примеры
- Выбор правильного подхода
Понимание проблемы
При запуске команды find без соответствующих прав она генерирует сообщения об ошибках “Permission denied”, которые появляются в выводе. Эти сообщения возникают, когда команда find пытается получить доступ к каталогам или файлам, для которых у вашей учетной записи нет прав на чтение.
Стандартная команда find . > files_and_folders отправляет как обычный вывод (stdout), так и сообщения об ошибках (stderr) в выходной файл. Чтобы подавить только сообщения об отказе в доступе, необходимо понимать, как Unix/Linux обрабатывает различные потоки вывода.
Стандартный поток ошибок (stderr) представлен дескриптором файла 2, в то время как стандартный вывод (stdout) - дескриптором файла 1. Это различие имеет решающее значение для правильной обработки ошибок.
Метод 1: Перенаправление всех ошибок в /dev/null
Самый простой подход - перенаправить весь вывод stderr в /dev/null, который отбрасывает все сообщения об ошибках:
find . > files_and_folders 2>/dev/null
Как это работает:
>перенаправляет stdout в файл2>/dev/nullперенаправляет stderr (дескриптор файла 2) в нулевое устройство- Все сообщения об отказе в доступе отбрасываются
Плюсы:
- Просто и легко запомнить
- Работает последовательно на всех системах Unix/Linux
- Удаляет все сообщения об ошибках, а не только об отказе в доступе
Минусы:
- Скрывает ВСЕ сообщения об ошибках, потенциально пропуская другие важные проблемы
- Вы не увидите другие типы ошибок, которые могут быть релевантны
Когда использовать:
- Вы абсолютно не хотите видеть никаких сообщений об ошибках
- Вас интересуют только успешные совпадения
- Вы запускаете команду с привилегиями root в любом случае
Метод 2: Фильтрация конкретных сообщений с помощью grep
Более целенаправленный подход использует grep для специфической фильтрации строк, содержащих “Permission denied”:
find . 2>&1 | grep -v "Permission denied" > files_and_folders
Как это работает:
2>&1перенаправляет stderr в stdout, так что оба потока объединяются|передает объединенный вывод в grepgrep -v "Permission denied"исключает строки, содержащие эту фразу>перенаправляет отфильтрованный вывод в ваш файл
Плюсы:
- Подавляет только сообщения об отказе в доступе
- Сохраняет другие сообщения об ошибках, которые могут быть полезны
- Более точная обработка ошибок
Минусы:
- Немного более сложный синтаксис
- Работает только если сообщение об ошибке содержит именно “Permission denied”
- Может не уловить вариации, такие как “Access denied” в некоторых системах
Когда использовать:
- Вы хотите видеть другие типы ошибок
- Вам нужно целенаправленно фильтровать сообщения об отказе в доступе
- Вы работаете с локализованными сообщениями об ошибках
Метод 3: Расширенная обработка ошибок
Для более сложной обработки ошибок можно использовать манипуляцию с дескрипторами файлов:
(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:
find . 2>&1 | grep -v "Permission denied" > files_and_folders
Как объясняется в ответе на Stack Overflow, “При использовании pipe следует помнить, что только стандартный вывод отправляется на вход другой команды, поэтому необходимо перенаправить stderr в stdout, а затем отправить stdout (2>&1).”
Почему это необходимо:
- Без
2>&1stderr все равно пойдет на ваш терминал - Только stdout будет передан в grep
- Сообщения об отказе в доступе все равно появятся на экране
Практические примеры
Пример 1: Простое подавление сообщений об отказе в доступе
find /var/log -name "*.log" 2>/dev/null > log_files.txt
Пример 2: Фильтрация конкретных сообщений об отказе в доступе
find /home -name "*.txt" 2>&1 | grep -v "Permission denied" > text_files.txt
Пример 3: Работа с локализованными сообщениями
Если ваша система использует локализованные сообщения об ошибках, может потребоваться сначала установить локаль:
LC_ALL=C find / -name "config*" 2>&1 | grep -v "Permission denied" > config_files.txt
Пример 4: Комбинирование с другими опциями find
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, что делает эти методы перенаправления эффективными.
Источники
- Linux / Unix Find Command Avoid Permission Denied Messages - nixCraft
- How can I exclude all “permission denied” messages from “find”? - Stack Overflow
- How to skip “permission denied” errors when running find in Linux - Unix & Linux Stack Exchange
- Exclude “Permission denied” Messages in find Command Output - Baeldung on Linux
- How to suppress warning or error messages in find command - Xmodulo
- 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, вы можете эффективно контролировать, что появляется в ваших выходных файлах, сохраняя при этом видимость важной системной информации.