Как удалить операторы распечатки «отказано в разрешении» из программы поиска?

38

Код

find / -name netcdf

Выход

find: `/root/.dbus': Permission denied
find: `/root/.gconf': Permission denied
find: `/root/.gconfd': Permission denied
find: `/root/.gnome': Permission denied
find: `/root/.gnome2': Permission denied
find: `/root/.gnome2_private': Permission denied
InquilineKea
источник
Связанный: unix.stackexchange.com/q/290791/16920
Лео Леопольд Герц

Ответы:

35

Эти сообщения отправляются в stderr, и в основном в этом выходном потоке обычно видны только эти сообщения. Вы можете закрыть его или перенаправить в командной строке.

$ find / -name netcdf 2>&-

или

$ find / -name netcdf 2>/dev/null

Кроме того, если вы собираетесь искать в корневом каталоге (/), то очень хорошо, когда процесс приятен, так как find не использует все ресурсы.

$ nice find / -name netcdf 2>&-

Это уменьшает приоритет процесса, позволяя другим процессам уделять больше времени процессору. Конечно, если больше ничего не использует процессор, он ничего не делает. :) Чтобы быть техническим, значение NI (видно из ps -l) увеличивает значение PRI. Более низкие значения PRI имеют более высокий приоритет. Сравните ps -lс nice ps -l.

Arcege
источник
1
Я не люблю выбрасывать предупреждения. С ними гораздо лучше справиться. Кроме того, не бежать здесь, в поле.
Лео Леопольд Герц 준영
1
@ LéoLéopoldHertz 준영 МЫ ... если вы не видите вывод программы, потому что ваш экран полон дерьма ошибок ... что в этом дело ...
кричит
20

Я просто хотел бы указать на этот ответ @Gilles в разделе Исключить пути, которые заставляют находить жалуются на разрешения - Unix & Linux Stack Exchange ; он в основном включает в себя конструкцию, findкоторая не позволяет спускаться с нечитаемых каталогов, и в этом смысле, вероятно, также немного быстрее.

Казалось бы, это работает для меня:

С GNU findили любой другой , findкоторый поддерживает -readableи -executableпредикаты:

find / -type d ! \( -readable -executable \) -prune -o -type f -name netcdf -print

или также это:

find / -type d ! -perm -g+r,u+r,o+r -prune -o -type f -name 'netcdf' -print

По какой-то причине мне нужно добавить все g+r,u+r,o+r(ярлык для этого есть a+r), в противном случае, если один из них пропущен, я все равно могу получить «Отказано в доступе».

Вот расстройство того , как я вижу (обратите внимание на -aоператор (а) в findэтом неявном между двумя предикатами ):

find /         # find starting from path /
  -type d        # match type is directory
  ! -perm -a+r   # (and) match not permissions of `r`ead present 
  -prune         # ignore what matched above and do not descend into it
  -o             # or (whatever didn't match above)
  -type f        # match type is file
  -name 'netcdf' # (and) match name is 'netcdf'
  -print         # print what matched above

Обратите внимание, что без последнего -printя получаю некоторые дополнительные предметы (которые не имеют ничего общего с -name 'netcdf'); что -printгарантирует , что печатаются только имя спички (если таковые имеются).

sdaau
источник
2
Если find(1)не может спуститься в каталог, он не будет. Так что проверка заранее, может ли она или нет, просто добавит работу (проверьте дважды) и тем самым замедлит ее.
vonbrand
3
@vonbrand это необходимо, если вы полагаетесь на findстатус выхода из России, потому что эти ошибки прав доступа приводят к findвыходу с ненулевым статусом
Эрнест А
Я не могу заставить ваше предложение работать. Я не получаю вывод, когда ожидаемый вывод заполнен. unix.stackexchange.com/q/290791/16920 Тем не менее, я думаю, в противном случае я думаю, что ваш метод - лучший путь.
Лео Леопольд Герц 준영
1
Ничего себе, я не могу поверить, что было так трудно найти этот ответ, теперь я хотел бы сделать больше, чем просто поднять голос.
Клин
8

Используйте locate(1)вместо:

$ locate netcdf

Он покажет вам только те файлы, которые видит ваш пользователь.

Уоррен Янг
источник
1
Это предполагает, что updatedbработает регулярно. Это не относится ко всем системам Linux.
Arcege
3
Если locate (1) установлен, его база данных должна периодически обновляться. Если этого не происходит, я бы отнес это к неправильной конфигурации, а не к ошибке locate (1). Кроме того, это займет всего несколько минут, чтобы запустить его вручную в тех редких случаях, когда вы ищете файл, который был добавлен с момента последнего обновления БД. Я делаю это, может быть, полдюжины раз в год, что легко оплачивается из-за преимущества locate (1) по сравнению с find (1).
Уоррен Янг