Как исключить все сообщения "permission denied" из команды "find"?
Я пытаюсь скрыть все сообщения об ошибках "permission denied" при выполнении команды:
find . > files_and_folders
Я экспериментирую с тем, в каких случаях появляются эти сообщения. Мне нужно собрать все папки и файлы, для которых такие сообщения не возникают.
Есть ли возможность записать уровни доступа в файл files_and_folders
?
Как можно скрыть ошибки в то же время?
5 ответ(ов)
Если вы хотите начать поиск с корня "/", то скорее всего вы увидите вывод, похожий на:
find: /./proc/1731/fdinfo: Permission denied
find: /./proc/2032/task/2032/fd: Permission denied
Это происходит из-за отсутствия прав доступа. Чтобы решить эту проблему, вы можете:
Использовать команду
sudo
:sudo find /. -name 'toBeSearched.file'
Эта команда запросит пароль суперпользователя. После ввода пароля вы увидите результаты поиска, которые вам нужны. Если у вас нет прав на использование команды sudo
, вам следует обратиться к системному администратору с просьбой добавить вас в файл sudoers.
Перенаправить стандартный поток ошибок (обычно выводимый на экран) в файл, чтобы избежать отображения сообщений об ошибках на экране! Можно перенаправить вывод в специальный файл
/dev/null
:find /. -name 'toBeSearched.file' 2>/dev/null
Перенаправить стандартный поток ошибок в стандартный вывод (также на экран), а затем использовать команду
grep
с параметром-v
, чтобы исключить строки, содержащие 'Permission denied':find /. -name 'toBeSearched.file' 2>&1 | grep -v 'Permission denied'
Для поиска программы expect
мне пришлось использовать следующую команду:
find / -name expect 2>/dev/null
Я указал имя, которое хотел найти, и перенаправил все ошибки в /dev/null
, чтобы не видеть лишних сообщений. В данном случае expect
– это название программы, которую я искал.
Чтобы перенаправить стандартный поток ошибок (stderr
) в /dev/null
, вы можете использовать конструкцию 2>/dev/null
. Это означает, что все сообщения об ошибках будут игнорироваться и не будут отображаться в терминале.
Например, команда, которая ищет файлы с указанным именем и отправляет ошибки в /dev/null
, будет выглядеть так:
find . -name '...' 2>/dev/null
В этой команде find
ищет файлы в текущем каталоге и его подкаталогах, и любое сообщение об ошибках (например, если у вас нет прав доступа к некоторым каталогам) будет перенаправлено в /dev/null
, effectively игнорируя их.
Вы можете перенаправить стандартный поток ошибок в Bash на Unix-машине, используя следующий синтаксис. Например, чтобы перенаправить стандартный поток ошибок в /dev/null
, вы можете использовать следующую команду:
find . 2>/dev/null >files_and_folders
В этом примере 2>/dev/null
означает, что поток стандартных ошибок (номер 2) будет перенаправлен в /dev/null
, что эффективно означает игнорирование любых ошибок, которые могут возникнуть во время выполнения команды. В то же время стандартный вывод (номер 1) будет записан в файл files_and_folders
.
Хотя вышеуказанные подходы не решают проблему для Mac OS X, так как эта система не поддерживает переключатель -readable
, вот как вы можете избежать ошибок 'Permission denied' в своем выводе. Это может быть полезно кому-то.
Вы можете использовать следующую команду:
find / -type f -name "your_pattern" 2>/dev/null
Если вы используете другую команду с find
, например, чтобы найти размер файлов с определенным шаблоном в каталоге, 2>/dev/null
также будет работать, как показано ниже:
find . -type f -name "your_pattern" -exec du -ch {} + 2>/dev/null | grep total$
Эта команда вернет общий размер файлов, соответствующих заданному шаблону. Обратите внимание на 2>/dev/null
в конце команды find
.
Извлечение имени файла и расширения в Bash
Как изменить цвет вывода echo в Linux
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как работает "cat << EOF" в bash?
Передача параметров в функцию Bash