Globstar da kullanabilirsiniz.
Bina grep
ile komutları find
zanna 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 --include
seçeneğini kullanma konusunda mükemmel bir yaklaşım yayınladı . Sadece kullanmak istiyorsanız grep
komutu 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
-H
Bayrak markaları grep
yalnızca bir eşleşen dosya bulunsa bile dosya adını gösterir. Sen geçebilir -a
, -i
ve -n
bayrakları (sizin örnekten) için grep
buysa yanı, sana gereken. Ancak geçmeyin -r
veya -R
bu 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 bash
açı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 globstar
Globstar kabuk seçeneğini kapatır.
Globstar ve arasında birkaç pratik fark vardır find
.
find
globstar'dan çok daha çok yönlüdür. Globstar ile yapabileceğiniz her şeyi, find
komutla 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ı grep
kürenin kendisi yerine komutunuza ( ) gönderir. file.txt
Sonuç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 find
bu 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 -exec
eylemi komutu bazı yollarla çalıştırır, daha sonra başka yollarla yeniden çalıştırır. grep
Birden 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.txt
bulunan 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 grep
renklendirilmiş çıktı üretecektir. Ama kolayca ile bu alabilirsiniz find
da .
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:grep
grep --color=auto
alias grep
find
grep
--color
find . -name file.txt -exec grep --color=auto -H 'pattern' {} +