Bir bulmanın bulunan dizinlere girmesini nasıl durdurabilirim?


24

Tüm dizinleri belirli bir dizeyle bulmak istiyorum, böylece içinde bulunan dosyaları başka bir tane bulabilirim.

Bu yüzden ./my-search-term/dir/my-search-termvb zaman harcamak istemiyorum .

Arama terim dizininin ilk dizinini bulduğumda özyinelemeyi nasıl durdurabilirim?


3
-Prune ile bulmayı denedin mi? Man sayfasından: "dosya bir dizin ise, içine inmeyin. -Depth verilirse, yanlış; sonuç yok. Çünkü -delete -depth'i ima ettiğinden -prune ve -delete'yi birlikte kullanamazsınız."
laebshade

1
@ laebshade neden bunu bir cevaba koymuyorsun?
jw013

@ jw013 O zamanlar daha net bir cevap verecek zamanım olmadı.
laebshade

Yanıtlar:


17

-pruneEylem yapan finddizine değil -recurse. Bunu, -exec( her iki şekilde de gerçekleştirildiği sürece , sırası -pruneve -execönemi yoktur) gibi başka bir eylemle birleştirebilirsiniz -prune.

find . -name my-search-term -prune -exec find {} … \;

findİçine iç içe yerleştirmenin find -execbiraz sorunlu olabileceğine dikkat -execedin: içte kullanamazsınız find, çünkü sonlandırıcı dış tarafından sonlandırıcı olarak görülecektir find. Bir kabuk çağırarak bu konuda çalışabilirsiniz, ancak alıntı yapmaktan kaçının.

find . -name my-search-term -prune -exec sh -c '
    find "$@" … -exec … {\} +
' _ {} +

İlk komutunuzdaki parantezler gerekli mi? true-prune döndürür ve önce koyulabilir . -exec
rozcietrzewiacz

@ rozcietrzewiacz Hayır, gerekli değil. -oOrada bulunma alışkanlığı sanırım. Ve sanırım daha -pruneönce koymak -execdaha okunaklı.
Gilles 'SO- kötülük' dur '14

Teşekkürler, -pruneseçeneği daha önce kullanmadı .
haridsv

Benim kullanım durumunda, bu komut: mkdir -p x1 x2; touch x1/x11 x1/x12 x2/x21 x2/x22; find . -name 'x1*' -exec rm -rf {} \;hata veriyor: find: ./x1: No such file or directory. Çözüm, komutun -prunesonuna eklemektir find.
haridsv

(1) Bazı sürümleri , bir argümanın temeli olarak görünse bile findgenişler . Böyle bir sürüm ikinci komutunuzda boğulacak, çünkü iç komutta (kabuk komutunda) dışta bulunan dizinin adı ile değiştirilecektir . Bunu , kabuğun hangi dönüşüme döneceğini  kullanarak söyleyerek düzeltebilirsiniz . … (Devam ediyor){}-execfind{}findfindfind . -name my-search-term -prune -exec sh -c 'find "$0" … -exec … "{"} +' {} \;"{"}{}
Scott

6

- çıplak çözümler -

findBulunan direktörün içeriğini atlamak, ancak diğer dizinlerde aramaya devam etmek istiyorsanız , -prune@ işaretin önerildiği şekilde kullanın . Tam komut sonra gibi görünmeli

 find . -type d -name somename -prune -exec ...

İstersen Öte yandan, findtamamen için arama durdurmak ve ilk eşleşen dizini bulduktan sonra, o zaman ne arıyorsun olduğunu -quit(versiyonundan beri mevcut 4.2.3ait GNU find). Bunu kullanmak biraz daha zor, çünkü findhemen çıkış yapıyor - bu yüzden -quitkomutun sonuna yerleştirilmelidir:

find . -type d -name somename -exec ... -quit

Bunun beklendiği gibi çalışması için, -execgeri dönüşlerin doğru olduğunu garanti etmek gerekir (başka bir deyişle, sıfır durum). Çıkış durumunun -execgöz ardı edilmesini istiyorsanız, -quither zaman işe yaraması için küçük bir numaraya ihtiyacınız var:

find . -type d -name somename \( -exec ... -o -true \) -quit

veya

find . -type d -name somename \( -exec ... -o -quit \)

veya

find . -type d -name somename \( -exec ... , -quit \) # a comma before -quit

- bazı açıklamalar -

Nasıl findçalıştığıyla ilgili en önemli şey , tüm eylemlerin ("testler") , soldan sağa doğru yorumlanan mantıksal öngörüler olarak ele alınmasıdır. Bu nedenle, son eylem (örneğin -quit) yalnızca önceki bölümün tamamı yanlış dönmediyse gerçekleştirilecektir . Varsayılan olarak, tüm testler mantıksal "AND" ile birleştirilir, -oseçenek bağlantıyı "OR" olarak değiştirir.

Bir zor unsuru -oolmasıdır findcan "optimize" Emrin ve çalışmaz -execsadece yazarsanız parçası

find . -type d -name somename -exec ... -o -quit

Bununla başa çıkmak için, find"OR" ile bağlanan tüm yüklemleri parantez içine alarak değerlendirmeye zorlayabilirsiniz .

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.