Globstar da kullanabilirsiniz.
Bina grepile komutları findzanna yanıtında olduğu gibi, (ayrıca bkz Bunu yapmak için son derece sağlam, çok yönlü ve taşınabilir bir yoldur sudodus cevabını ). Ve muru, grep'ın --includeseçeneğini kullanma konusunda mükemmel bir yaklaşım yayınladı . Sadece kullanmak istiyorsanız grepkomutu ve kabuk, bunu yapmak için başka bir yol yoktur - Yapabileceğiniz kendisi kabuk gerekli özyineleme :
shopt -s globstar # you can skip this if you already have globstar turned on
grep -H 'pattern' **/file.txt
-HBayrak markaları grepyalnızca bir eşleşen dosya bulunsa bile dosya adını gösterir. Sen geçebilir -a, -ive -nbayrakları (sizin örnekten) için grepbuysa yanı, sana gereken. Ancak geçmeyin -rveya -Rbu yöntemi kullanırken. Öyle kabuk içeren glob desen genişleyen dizinleri recurses **ve değilgrep .
Bu talimatlar Bash kabuğuna özeldir. Bash, Ubuntu'daki (ve diğer birçok GNU / Linux işletim sistemindeki) varsayılan kullanıcı kabuğudur, bu nedenle Ubuntu'daysanız ve kabuğunuzun ne olduğunu bilmiyorsanız, neredeyse kesinlikle Bash'tir. Popüler mermiler genellikle dizin geçişli **küreleri desteklese de , her zaman aynı şekilde çalışmazlar. Daha fazla bilgi için, bkz Stéphane Chazelas 'ın mükemmel cevabı için ls sonucu *** ** ve ls, ls * üzerine Unix.SE .
Nasıl çalışır
Açılması globstar bash kabuk seçeneği yapar **dizin ayırıcı içeren maç yolları ( /). Bu nedenle, dizin yinelenen bir globtur. Özellikle, man bashaçıkladığı gibi:
Ne zaman globstar kabuk seçeneği etkinleştirildiğinde ve * bir yol adı genişleme bağlamında kullanıldığında, iki bitişik * tüm dosya ve sıfır veya daha fazla dizinleri ve alt dizinleri maç olacak tek bir model olarak kullanılabilir s. Bunu bir / ile takip ederseniz, bitişik iki * yalnızca dizinlerle ve alt dizinlerle eşleşir.
Değiştirmek veya niyetinde çok daha fazla dosyaları silmek komutları çalıştırabilirsiniz beri yazdığınız özellikle eğer, bununla dikkatli olmalıdır **yazmak isterken *. (Hiçbir komutu değiştirmeyen bu komutta güvenlidir.) shopt -u globstarGlobstar kabuk seçeneğini kapatır.
Globstar ve arasında birkaç pratik fark vardır find.
findglobstar'dan çok daha çok yönlüdür. Globstar ile yapabileceğiniz her şeyi, findkomutla da yapabilirsiniz. Globstar'ı severim ve bazen daha uygun olur, ancak globstar genel bir alternatif değildir find.
Yukarıdaki yöntem, adları a ile başlayan dizinlerin içine bakmaz .. Bazen bu klasörleri geri almak istemezsiniz, ama bazen yaparsınız.
Sıradan bir kürede olduğu gibi, kabuk tüm eşleşen yolların bir listesini oluşturur ve bunları grepkürenin kendisi yerine komutunuza ( ) gönderir. file.txtSonuçta ortaya çıkan komutun sistemin yürütülmesi için çok uzun olacağı denilen çok fazla dosyanız varsa , yukarıdaki yöntem başarısız olur. Pratikte (en azından) binlerce dosyaya ihtiyacınız olacak, ancak bu olabilir.
Kullanılan yöntemler findbu kısıtlamaya tabi değildir, çünkü:
Zanna'nın yolugrep potansiyel olarak birçok yol argümanı içeren bir komut oluşturur ve çalıştırır . Ancak, tek bir yolda listelenenden daha fazla dosya bulunursa, +-terminated -execeylemi komutu bazı yollarla çalıştırır, daha sonra başka yollarla yeniden çalıştırır. grepBirden fazla dosyada bir dize girilmesi durumunda , bu doğru davranışı sağlar.
Burada kapsanan globstar yöntemi gibi, bu da eşleşen tüm satırları, her birinin başına yollar eklenmiş olarak yazdırır.
sudodus'un yolugrep her file.txtbulunan için ayrı çalışır . Çok fazla dosya varsa, diğer bazı yöntemlerden daha yavaş olabilir, ancak çalışır.
Bu yöntem dosyaları bulur ve yollarını yazdırır, ardından varsa eşleşen satırları izler. Bu benim yöntem, Zanna ve muru tarafından üretilen biçiminden farklı bir çıktı biçimidir .
İle renklendirme find
Globstar kullanmanın en önemli avantajlarından biri, varsayılan olarak Ubuntu'da greprenklendirilmiş çıktı üretecektir. Ama kolayca ile bu alabilirsiniz findda .
Ubuntu'daki kullanıcı hesapları , gerçekten çalıştırılan ( görmek için çalıştırılan ) bir takma adla oluşturulur . Bu var iyi bir şey takma adlar olduğunu hemen hemen sadece etkileşimli onları kesilirken genişletilmiş , ancak isterseniz demektir çağırmaya ile bayrak, açıkça yazmak gerekecek. Örneğin:grepgrep --color=autoalias grepfindgrep--color
find . -name file.txt -exec grep --color=auto -H 'pattern' {} +