Як я можу видалити заяви про відмову у дозволі з програми пошуку?


Відповіді:


35

Ці повідомлення надсилаються до stderr, і в основному лише ті повідомлення зазвичай бачать у цьому вихідному потоці. Ви можете закрити або перенаправити його в командному рядку.

$ find / -name netcdf 2>&-

або

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

Крім того, якщо ви збираєтеся шукати кореневу директорію (/), тоді часто добре приємно провести процес, тому пошук не споживає всіх ресурсів.

$ nice find / -name netcdf 2>&-

Це зменшує пріоритетність процесу, що дозволяє іншим процесам більше часу на процесорі. Звичайно, якщо більше нічого не використовує процесор, він нічого не робить. :) Щоб бути технічним, значення NI (видно з ps -l) збільшує значення PRI. Більш низькі значення PRI мають більший пріоритет. Порівняйте ps -lз nice ps -l.


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гарантує , що друкуються тільки ім'я сірники (якщо такі є).


2
Якщо find(1)не вдається зійти в каталог, він не стане. Тож попередньо перевіривши, чи може це чи ні, просто додасть роботу (перевірте двічі) і тим самим сповільнить її.
фонбранд

3
@vonbrand це необхідно, якщо ви покладаєтесь на findстатус виходу, тому що ці помилки дозволу роблять findвихід із ненульовим статусом
Ернест А

Я не можу змусити вашу пропозицію працювати. Я не отримую виводу, коли очікуваний вихід повний. unix.stackexchange.com/q/290791/16920 Однак я думаю, що в іншому випадку я думаю, що ваш метод - найкращий шлях.
Лео Леопольд Герц 준영

1
Нічого собі, я не можу повірити, що настільки важко було знайти цю відповідь, я б хотів, щоб я міг зробити більше, ніж просто підтвердити її.
Клин

8

Використовуйте locate(1)замість цього:

$ locate netcdf

Він покаже лише ті файли, які може бачити ваш користувач.


1
Це передбачає, що updatedbпрацює регулярно. Це не так у всіх системах Linux.
Арседж

3
Якщо встановлено locate (1), його базу даних слід періодично оновлювати. Якщо цього не відбувається, я б класифікував це неправильну конфігурацію, а не помилку пошуку (1). Крім того, потрібно лише кілька хвилин, щоб запустити його вручну в рідкісних випадках, коли ви шукаєте файл, який був доданий з моменту останнього оновлення БД. Я вважаю, що роблю це, можливо, півдесятка разів на рік, накладні витрати легко сплачуються за рахунок переваги швидкості локації (1) над знахідкою (1).
Warren Young
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.