Not:
* Bu cevap muhtemelen kullanım durumunun gerektirdiğinden daha derine iner ve find 2>/dev/null
birçok durumda yeterince iyi olabilir. Platformlar arası bir bakış açısı ve bazı ileri kabuk tekniklerinin, mümkün olduğu kadar sağlam bir çözüm bulmak amacıyla tartışılması ilgi çekebilir, ancak korunan davalar büyük ölçüde varsayımsal olabilir.
* Sisteminiz yerelleştirilmiş hata mesajlarını gösterecek şekilde yapılandırılmışsa , İngilizce mesajların bildirildiğinden emin olmak için find
aşağıdaki çağrılara LC_ALL=C
( LC_ALL=C find ...
) önek koyun , böylece amaçlanan şekilde çalışır. Bununla beraber her zaman herhangi bir hata iletileri do görüntülenen olsun sonra İngilizce olması yanı olacaktır. grep -v 'Permission denied'
Sizin ise kabuk bash
veyazsh
, orada makul basit olurken sağlam bir çözüm kullanılarak, sadece POSIX uyumlu find
özelliklere ; ise bash
POSIX'e parçası değil kendisi en modern Unix platformlarında bu çözüm yaygın taşınabilir hale onunla gelir:
find . > files_and_folders 2> >(grep -v 'Permission denied' >&2)
Not: Genel komut, içerideki komutun bitmesini beklemediğinden , bazı grep
çıktılarının tamamlandıktan sonra gelmesi olasılığı düşüktür . Gelen , sen ekleyerek bunu engelleyebilirsiniz komutuna.find
>(...)
bash
| cat
>(...)
Bir (nadiren kullanılır) 'dir çıkış süreci ikamesi bu durumda (çıkış yönlendirme sağlar, stderr çıkışı ( 2>
komut içinin stdin'e) >(...)
.
ilaveten bash
ve zsh
, ksh
yanı destekler onları prensipte ancak gelen yönlendirme ile bunları birleştirmek için çalışıyor stderr , burada yapıldığı gibi ( 2> >(...)
) sessizce göz ardı ediliyor gibi görünmektedir ksh 93u+
.
grep -v 'Permission denied'
filtre üzerinden ( -v
) (tüm hatlar find
ifadeyi içeren komutunun şekilde hataları akım) Permission denied
ve stderr'e kalan sinyallerini üretecek ( >&2
).
Bu yaklaşım:
sağlam : grep
yalnızca hata iletilerine (ve potansiyel olarak yanlış pozitiflere yol açan dosya yollarının ve hata iletilerinin bir kombinasyonuna değil) uygulanır ve izin reddedilenler dışındaki hata iletileri stderr'e iletilir.
tarafının etkisi ücretsiz : find
'ın çıkış kodu korunur: erişime çıkış kodunda sonuçları karşılaşılan dosya sistemi öğelerden en az biri yetersizlik 1
(yani hatalar olmadığı konusunda bilgi olmasa da diğer izni reddedildi olanlardan daha (oluştu çok)).
POSIX uyumlu çözümler:
Tamamen POSIX uyumlu çözümlerin ya sınırlamaları vardır ya da ek çalışmalar gerektirir.
Eğer find
bireyin çıkışı yakalanan edilecek dosyanın zaten (veya tamamen bastırılmış), sonra gelen boru hattı tabanlı çözüm Jonathan Leffler cevap basit, sağlam ve POSIX uyumludur:
find . 2>&1 >files_and_folders | grep -v 'Permission denied' >&2
: Yönlendirmeler sırası önemlidir unutmayın 2>&1
gelmelidir ilk .
Bir dosyanın ön tarafındaki stdout çıktısının yakalanması , ardışık düzende açık bir şekilde çalışabilen yalnızca hata mesajlarını boru hattı üzerinden 2>&1
göndermeye izin verir .grep
Tek dezavantajı olduğunu genel çıkış kodu olacaktır grep
komutunun değil find
varsa, bu davadan araçlarında 'ın, hiçbir tamamını veya en hatalar sadece izne reddedildi hataları, çıkış kodu olacaktır 1
(sinyalizasyon arızası (aksi takdirde) izin reddedilenler dışındaki hatalar) 0
- niyetin tam tersi.
Bununla birlikte, find
çıkış kodu nadiren kullanılır , çünkü genellikle varolmayan bir yoldan geçmek gibi temel başarısızlığın ötesinde çok az bilgi taşır .
Bununla birlikte, sadece bazılarının bileGiriş yolları sebebiyle izinleri olmaması için erişilemez olma olduğu yansıtılır find
(GNU ve BSD hem de 'in çıkış kodu find
): bir izin reddedildi hata için oluşması durumunda herhangi bir işlenmiş dosyaların, çıkış kodu olarak ayarlanır 1
.
Aşağıdaki varyasyon şunları ele almaktadır:
find . 2>&1 >files_and_folders | { grep -v 'Permission denied' >&2; [ $? -eq 1 ]; }
Şimdi, çıkış kodu dışında herhangi bir hata olup olmadığını gösterir Permission denied
: 1
öyleyse, 0
aksi takdirde.
Başka bir deyişle: çıkış kodu artık komutun gerçek niyetini yansıtmaktadır: 0
Hiç hata yoksa veya yalnızca izin verilmeyen hatalar oluşmazsa success ( ) bildirilir .
Bu, find
üstteki çözümde olduğu gibi, çıkış kodunu geçirmekten bile daha iyidir .
gniourf_gniourf yorumlarda (hala POSIX uyumlu) önermektedir sofistike yönlendirmeleri kullanarak bu çözümün genelleme , dosya yolları baskı varsayılan davranışı ile bile çalışır Stdout'a :
{ find . 3>&2 2>&1 1>&3 | grep -v 'Permission denied' >&3; } 3>&2 2>&1
Kısacası: 3
stdout ( 1
) ve stderr ( 2
) işlevlerini geçici olarak değiştirmek için özel dosya tanımlayıcı kullanılır , böylece hata iletileri yalnızcagrep
stdout aracılığıyla iletilebilir .
Bu yönlendirmeler olmadan, hem veriler (dosya yolları) hem de hata iletileri grep
stdout aracılığıyla iletilir ve grep
daha sonra hata iletisi Permission denied
ile adı ifadeyi içeren bir (varsayımsal) dosya arasında ayrım yapamaz Permission denied
.
Bununla birlikte, ilk çözümde olduğu gibi, bildirilen çıkış kodu grep
'değil find
' olacaktır , ancak yukarıdaki ile aynı düzeltme uygulanabilir.
Mevcut cevaplarla ilgili notlar:
Hakkında nota birkaç nokta vardır Michael brux cevabı , find . ! -readable -prune -o -print
:
GNU gerektirir find
; özellikle macOS üzerinde çalışmaz. Tabii ki, sadece GNU ile çalışmak için komuta ihtiyacınız varsa find
, bu sizin için bir sorun olmayacaktır.
Bazı Permission denied
hatalar hala ortaya çıkabilir : geçerli kullanıcının izni olduğu dizinlerin alt öğeleri find ! -readable -prune
için bu tür hataları bildirir , ancak (yürütülebilir) izne sahip değildir. Sebebi dizinin kendisi olmalarındandır olan okunabilir, infaz edilmez ve aşağı inerek girişimi içine bu dizinde sonra hata iletileri tetikler. Bununla birlikte, tipik durum iznin eksik olması içindir.r
x
-prune
r
Not: Aşağıdaki nokta, bir felsefe ve / veya belirli bir kullanım durumu meselesidir ve bunun sizin için uygun olmadığına ve komutun ihtiyaçlarınızı tam olarak karşıladığına karar verebilirsiniz, özellikle de sadece yolları yazdırmanız yeterlidir :
- Eğer siz izin reddedildi hata mesajlarının bir filtrelenmesini conceptualize ayrı sen uygulamak isterler bu görev herhangi
find
komuta ardından proaktif ters yaklaşımı engelleyen izni reddedildi hataları içine "gürültü" tanıtan gerektirir find
komutu, aynı zamanda tanıtır karmaşıklık ve mantık tuzakları .
- Örneğin, Michael'ın cevabına en çok oylanan yorum (bu yazıdan itibaren) , aşağıdaki gibi bir filtre ekleyerek komutun nasıl genişletileceğini göstermeye çalışır
-name
:
find . ! -readable -prune -o -name '*.txt'
Ancak, bu , amaçlanan şekilde çalışmaz, çünkü sondaki -print
eylem gereklidir ( bu cevapta bir açıklama bulunabilir ). Bu incelikler böcek getirebilir.
İlk çözüm Jonathan Leffler cevap , find . 2>/dev/null > files_and_folders
kendisinin de ifade ettiği gibi, körü körüne susturan bütün hata mesajlarını (ve o da açıkladığı gibi geçici çözüm, tamamen sağlam hantal ve değil). Pragmatik olarak konuşmak gerekirse , en basit çözümdür , çünkü herhangi bir hatanın ve tüm izinlerle ilgili olacağını varsaymaktan memnun olabilirsiniz.
mist cevabı , sudo find . > files_and_folders
, özlü ve pragmatik ancak sadece başka bir şey için tedbirsiz olduğu baskı dosya adları güvenlik nedenleriyle,: Eğer olarak çalıştırıyorsunuz çünkü kök kullanıcı, "find bir hata berbat olmak için tüm sistemi sahip riski veya kötü amaçlı bir sürümü veya beklenmedik bir şekilde yazan yanlış bir çağrıyı (normal ayrıcalıklarla çalıştırırsanız gerçekleşmeyebilir) "(sisin üçlü olarak yanıtına yaptığı bir yorumdan ).
İçinde 2 solüsyon viraptor cevabı , find . 2>&1 | grep -v 'Permission denied' > some_file
ve potansiyel olarak yerine raporlama (nedeniyle boru hattından stdout ve stderr bir karışımını gönderme) yanlış pozitif riskini taşır olmayan çıkış yolları yanında yakalar, onları stderr'e yoluyla -permission reddedildi hataları çıktı dosyasında.
find . 2>&1 > files_and_folders | grep -v 'Permission denied' >&2
?