Bagaimana cara menghapus pernyataan cetakan "ditolak izin" dari program find?

38

Kode

find / -name netcdf

Keluaran

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
sumber
Terkait: unix.stackexchange.com/q/290791/16920
Léo Léopold Hertz 준영

Jawaban:

35

Pesan-pesan itu dikirim ke stderr, dan cukup banyak hanya pesan-pesan itu yang secara umum terlihat pada aliran keluaran itu. Anda dapat menutupnya atau mengalihkannya di command-line.

$ find / -name netcdf 2>&-

atau

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

Juga, jika Anda akan mencari direktori root (/), maka sering kali baik untuk proses yang baik sehingga menemukan tidak mengkonsumsi semua sumber daya.

$ nice find / -name netcdf 2>&-

Ini mengurangi prioritas proses yang memungkinkan proses lain lebih banyak waktu pada CPU. Tentu saja jika tidak ada yang menggunakan CPU, itu tidak melakukan apa-apa. :) Secara teknis, nilai NI (terlihat dari ps -l) meningkatkan nilai PRI. Nilai PRI yang lebih rendah memiliki prioritas yang lebih tinggi. Bandingkan ps -ldengan nice ps -l.

Arcege
sumber
1
Saya tidak suka membuang peringatan. Jauh lebih baik menangani mereka. Juga, tidak ada yang lolos di sini di lapangan.
Léo Léopold Hertz 준영
1
@ LéoLéopoldHertz 준영 WEll ... jika Anda tidak dapat melihat output program karena layar Anda penuh dengan omong kosong kesalahan .. yang ini terjadi ...
chrips
20

Saya hanya ingin menunjukkan jawaban ini oleh @Gilles di jalur Kecualikan yang membuat keluh kesah tentang izin - Unix & Linux Stack Exchange ; itu pada dasarnya melibatkan sebuah konstruksi findyang membuatnya tidak turun ke direktori yang tidak dapat dibaca, dan dalam hal itu, mungkin juga sedikit lebih cepat.

Ini sepertinya bekerja untuk saya:

Dengan GNU findatau yang lain findyang mendukung -readabledan -executablepredikat:

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

atau juga ini:

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

Untuk beberapa alasan, saya perlu menambahkan semua g+r,u+r,o+r(pintasan untuk itu a+r), jika tidak jika salah satu dari mereka tidak ada, saya mungkin masih mendapatkan hit "Permission Denied".

Berikut ini adalah rincian tentang bagaimana saya melihat ini (perhatikan -aoperator (dan) di findadalah implisit antara dua predikat ):

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

Perhatikan bahwa tanpa yang terakhir -print, saya mendapatkan beberapa item tambahan yang ditampilkan (yang tidak ada hubungannya dengan -name 'netcdf'); yang -printmemastikan bahwa hanya nama yang cocok yang dicetak (jika ada).

sdaau
sumber
2
Jika find(1)tidak bisa turun ke direktori, itu tidak akan. Jadi memeriksa terlebih dahulu apakah bisa atau tidak hanya akan menambah kerja (periksa dua kali), dan dengan demikian memperlambatnya.
vonbrand
3
@vonbrand perlu jika Anda mengandalkan findstatus keluar, karena kesalahan izin ini membuat findkeluar dengan status tidak-nol
Ernest A
Saya tidak dapat membuat proposal Anda berfungsi. Saya tidak mendapatkan output saat output yang diharapkan penuh. unix.stackexchange.com/q/290791/16920 Namun, saya pikir sebaliknya saya pikir metode Anda adalah cara terbaik untuk pergi.
Léo Léopold Hertz 준영
1
Wow, saya tidak percaya sulitnya menemukan jawaban ini, saya sekarang berharap bisa melakukan lebih dari sekadar meningkatkannya.
Wedge
8

Gunakan locate(1)sebaliknya:

$ locate netcdf

Ini hanya akan menampilkan file yang dapat dilihat pengguna Anda.

Warren Young
sumber
1
Ini mengasumsikan bahwa updatedbitu berjalan secara teratur. Itu tidak terjadi pada semua sistem Linux.
Arcege
3
Jika loc (1) diinstal, database-nya harus diperbarui secara berkala. Jika itu tidak terjadi, saya akan mengklasifikasikan kesalahan konfigurasi itu daripada kesalahan loc (1). Selain itu, hanya perlu beberapa menit untuk menjalankannya dengan tangan dalam kasus yang jarang terjadi di mana Anda mencari file yang ditambahkan sejak pembaruan DB terakhir. Saya menemukan diri saya melakukan itu mungkin setengah lusin kali per tahun, biaya overhead mudah dibayar dari keuntungan kecepatan menemukan (1) daripada menemukan (1).
Warren Young