"İzin reddedildi" çıktı ifadelerini find programından nasıl kaldırırım?


Yanıtlar:


35

Bu mesajlar stderr'e gönderilir ve hemen hemen yalnızca bu mesajlar genellikle bu çıkış akışında görülür. Kapatabilir veya komut satırından yönlendirebilirsiniz.

$ find / -name netcdf 2>&-

veya

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

Ayrıca, kök dizini (/) arayacaksanız, süreci güzelleştirmek genellikle iyidir, bu nedenle bul tüm kaynakları tüketmez.

$ nice find / -name netcdf 2>&-

Bu, diğer işlemlerin CPU üzerinde daha fazla zaman geçirmesini sağlayan işlem önceliğini azaltır. Elbette CPU kullanan başka bir şey yoksa, hiçbir şey yapmaz. :) Teknik olarak, NI değeri (görüldüğü gibi ps -l) PRI değerini artırır. Düşük PRI değerleri daha yüksek önceliğe sahiptir. Karşılaştırma ps -lile nice ps -l.


1
Uyarıları atmayı sevmiyorum. Onlarla başa çıkmak daha iyidir. Ayrıca, burada sahada kaçış yok.
Léo Léopold Hertz 준영

1
Senin ekran Bu durumda hata bok .. doludur çünkü programın çıktısını göremiyorsanız LéoLéopoldHertz 준영 Eh @ ... ...
chrips

20

Sadece bu cevabı @Gilles'in İzinleri hakkında şikayette bulunma yollarını Hariç Tutma yollarında belirtmesini istiyorum - Unix ve Linux Stack Exchange ; temel olarak findokunamayan dizinlere iniş yapmamasını sağlayan bir yapı içerir ve bu anlamda muhtemelen biraz daha hızlıdır.

Bu benim için işe yarayacak gibi görünüyor:

GNU ile findveya başka herhangi bir finddesteklediğini -readableve -executableyüklemler'ıN:

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

veya ayrıca bu:

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

Bazı nedenlerden dolayı hepsini eklemem gerekiyor g+r,u+r,o+r(bunun için kısayol a+r), aksi halde bir tanesi dışarıda kalırsa, hala "İzin Reddedildi" isabetlerini alabilirim.

İşte bunu nasıl gördüğümün bir dökümü (içinde -a(ve) operatörünün iki yüklem arasında kapalıfind olduğuna dikkat edin ):

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

Sonuncusu olmadan, -printgösterilen bazı ekstra öğeleri aldığımı (bununla ilgisi olmayan -name 'netcdf') alacağımı unutmayın ; -printSadece isim maçlar basılır olmasını sağlar (eğer varsa).


2
Eğer find(1)bir dizinin içine girer olamaz, olmayacaktır. Bu yüzden önceden yapıp yapamayacağınızı kontrol etmek sadece iş ekler (iki kez kontrol edin) ve böylece yavaşlatır.
von

3
@ vonbrand findçıkış durumuna güveniyorsanız gereklidir , çünkü bu izin hataları findsıfır olmayan statüyle çıkış yapar
Ernest A

Teklif işini bulamıyorum. Beklenen çıktı dolduğunda çıktı alamıyorum. unix.stackexchange.com/q/290791/16920 Ancak, aksi halde bence yönteminizin en iyi yol olduğunu düşünüyorum.
Léo Léopold Hertz 준영

1
Vay canına, bu cevabı bulmanın çok zor olduğuna inanamıyorum, şimdi keşke sadece oy vermekten daha fazlasını yapabilmeyi diliyorum.
Kama

8

locate(1)Bunun yerine kullanın :

$ locate netcdf

Yalnızca kullanıcılarınızın görebileceği dosyaları gösterir.


1
Bu updatedb, düzenli çalıştığını varsayar . Tüm Linux sistemlerinde durum böyle değil.
Arcege

3
(1) yüklü bulursanız, onun veritabanı gerektiğini periyodik olarak güncellenecektir. Bu olmazsa, bir konum hatası (1) yerine yanlış bir yapılandırma olduğunu sınıflardım. Ek olarak, son DB güncellemesinden bu yana eklenen bir dosyayı aradığınız nadir durumlarda el ile çalıştırmak sadece birkaç dakika alır. Yılda belki yarım düzine kere bunu yaparken kendimi buluyorum (1) 'i bulup (1)' in hız avantajından kolayca ödediler.
Warren Young
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.