Jak usunąć instrukcje wydruku „odmowa uprawnień” z programu wyszukiwania?

38

Kod

find / -name netcdf

Wydajność

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
źródło
Powiązane: unix.stackexchange.com/q/290791/16920
Léo Léopold Hertz 준영

Odpowiedzi:

35

Te wiadomości są wysyłane do stderr i właściwie tylko te wiadomości są ogólnie widoczne w tym strumieniu wyjściowym. Możesz go zamknąć lub przekierować w wierszu polecenia.

$ find / -name netcdf 2>&-

lub

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

Ponadto, jeśli zamierzasz przeszukać katalog główny (/), to często dobrze jest miło proces, aby znaleźć nie zużywa wszystkich zasobów.

$ nice find / -name netcdf 2>&-

Zmniejsza to priorytet procesu, pozostawiając innym procesom więcej czasu na procesorze. Oczywiście, jeśli nic więcej nie korzysta z procesora, nic nie robi. :) Mówiąc technicznie, wartość NI (patrząc od ps -l) zwiększa wartość PRI. Niższe wartości PRI mają wyższy priorytet. Porównaj ps -lz nice ps -l.

Arcege
źródło
1
Nie lubię rzucać ostrzeżeń. O wiele lepiej sobie z nimi poradzić. Poza tym nie ma tu ucieczki w terenie.
Léo Léopold Hertz -
1
@ LéoLéopoldHertz 준영 WEll ... jeśli nie widzisz danych wyjściowych programu, ponieważ twój ekran jest pełen gówna błędów ... w takim przypadku ...
woła
20

Chciałbym tylko wskazać na tę odpowiedź @Gilles w Wyklucz ścieżki, które sprawiają, że znajdowanie narzeka na uprawnienia - Unix i Linux Stack Exchange ; w zasadzie zawiera konstrukcję, findktóra sprawia, że ​​nie schodzi ona z nieczytelnych katalogów, i w tym sensie jest prawdopodobnie również nieco szybsza.

To wydaje się działać dla mnie:

Z GNU findlub dowolnym innym, findktóry obsługuje -readablei -executablepredykaty:

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

lub też to:

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

Z jakiegoś powodu muszę dodać wszystkie g+r,u+r,o+r(do tego skrót a+r), w przeciwnym razie, jeśli jeden z nich zostanie pominięty, nadal mogę otrzymać trafienia „Odmowa zezwolenia”.

Oto podział tego, w jaki sposób to widzę (zauważ, że -aoperator (i) findjest ukryty między dwoma predykatami ):

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

Zauważ, że bez tego ostatniego -printotrzymuję dodatkowe przedmioty (które nie mają z tym nic wspólnego -name 'netcdf'); to -printzapewnia, że tylko mecze nazw są drukowane (jeśli występują).

sdaau
źródło
2
Jeśli find(1)nie można zejść do katalogu, nie będzie. Wcześniejsze sprawdzenie, czy można, czy nie, po prostu doda pracę (sprawdź dwa razy), a tym samym spowolni.
vonbrand
3
@ vonbrand jest konieczne, jeśli polegasz na findstatusie wyjścia, ponieważ te błędy uprawnień powodują findwyjście z niezerowym statusem
Ernest A
Nie mogę uzyskać twojej propozycji. Nie otrzymuję danych wyjściowych, gdy oczekiwany wynik jest pełny. unix.stackexchange.com/q/290791/16920 Jednak myślę, że w przeciwnym razie uważam, że twoja metoda jest najlepszym sposobem.
Léo Léopold Hertz
1
Wow, nie mogę uwierzyć, że tak trudno było znaleźć tę odpowiedź, chciałbym teraz zrobić coś więcej niż tylko głosować.
Wedge
8

locate(1)Zamiast tego użyj :

$ locate netcdf

Pokażą tylko pliki, które użytkownik może zobaczyć.

Warren Young
źródło
1
Zakłada się, że updatedbdziała regularnie. Nie dotyczy to wszystkich systemów Linux.
Arcege
3
Jeśli locate (1) jest zainstalowany, jego baza danych powinna być okresowo aktualizowana. Jeśli tak się nie dzieje, sklasyfikowałbym raczej błędną konfigurację niż błąd lokalizacji (1). Ponadto uruchomienie go ręcznie zajmuje tylko kilka minut w rzadkich przypadkach, w których szukasz pliku dodanego od ostatniej aktualizacji bazy danych. Uważam, że robię to może pół tuzina razy w roku, narzut, który można łatwo opłacić z przewagi prędkości lokalizowania (1) nad znalezieniem (1).
Warren Young,