Bunu çok kullandım, elde etmeye çalıştığım gelişme grep'te eşleşmeyen yankı dosya adlarından kaçınmak. Bunu yapmanın daha iyi bir yolu var mı?
for file in `find . -name "*.py"`; do echo $file; grep something $file; done
Bunu çok kullandım, elde etmeye çalıştığım gelişme grep'te eşleşmeyen yankı dosya adlarından kaçınmak. Bunu yapmanın daha iyi bir yolu var mı?
for file in `find . -name "*.py"`; do echo $file; grep something $file; done
Yanıtlar:
find . -name '*.py' -exec grep something {} \; -print
eşleşen satırdan sonra dosya adını yazdırır .
find . -name '*.py' -exec grep something /dev/null {} +
dosya adını eşleşen her satırın önüne yazdıracaktır ( yalnızca bir dosya geçtiğinde dosya adını yazdırmayacağı için /dev/null
yalnızca bir eşleşen dosyanın olduğu durum için ekleriz grep
. GNU uygulamasının grep
bunun için bir -H
seçeneği vardır alternatif olarak).
find . -name '*.py' -exec grep -l something {} +
yalnızca en az bir eşleşen satırı olan dosyaların dosya adlarını yazdırır.
Dosya adını eşleşen satırlardan önce yazdırmak için bunun yerine awk kullanabilirsiniz:
find . -name '*.py' -exec awk '
FNR == 1 {filename_printed = 0}
/something/ {
if (!filename_printed) {
print FILENAME
filename_printed = 1
}
print
}' {} +
Veya grep
her dosya için iki kez arayın - ancak en az bir grep
komut ve her dosya için en fazla iki komut çalıştıracağı için daha az verimli olurdu (ve dosyanın içeriğini iki kez okuyun):
find . -name '*.py' -exec grep -l something {} \; \
-exec grep something {} \;
Her durumda, sen toplayıp çıkış döngü istemiyorum find
böyle ve senin değişkenleri alıntı unutmayın .
GNU araçlarıyla bir kabuk döngüsü kullanmak istiyorsanız:
find . -name '*.py' -exec grep -l --null something {} + |
xargs -r0 sh -c '
for file do
printf "%s\n" "$file"
grep something < "$file"
done' sh
(ayrıca FreeBSD ve türevleri üzerinde de çalışır).
GNU grep kullanıyorsanız, bu basit bulguyu sizin için yapmak için onun -r
veya --recursive
seçeneğini kullanabilirsiniz :
grep -r --include '*.py' -le "$regexp" ./ # for filenames only
grep -r --include '*.py' -He "$regexp" ./ # for filenames on each match
Yalnızca find
daha gelişmiş tahminlere ihtiyacınız varsa gerekir.
grep
, grep
ya da dizin sembolik veya çapraz sembolik içine bakmak ya da olmayabilir. Diğer normal olmayan dosya türlerinin işlenmesinde de bazı farklılıklar bulabilirsiniz.
Grep'e dosya adını çıktıya eklemesini söyleyebilirsiniz. Yani bir eşleşme varsa konsolda gösterilir; bir dosyada eşleşme yoksa, o dosya için hiçbir satır yazdırılmaz.
find . -name "*.py" | xargs grep -n -H something
Gönderen man grep
:
-H Always print filename headers with output lines
-n, --line-number
Each output line is preceded by its relative line number in the file, starting at line 1. The line number counter is reset for each file processed.
This option is ignored if -c, -L, -l, or -q is specified.
Dosyalarınızda boşluklu isimler varsa, ayırıcı olarak NUL Karakterleri kullanmak için boruyu değiştirmeniz gerekir. Tam komut şimdi şöyle görünecek:
find . -name "*.py" -print0 | xargs -0 grep -n -H something
Şöyle bir şey deneyebilirsiniz:
find . -name "*.py:" -exec grep -l {} \;
Find komutu ve standart find komut özelliği ile keşfedilen her dosya için bu exec grep komutu
Orada grep
varsayılan çıkış tarafından formatında sonuçları istediğiniz alternatifler. Bildiğim en popüler 2 tanesi ag
(aka "gümüş arayıcı") ve ack
. ag
daha hızlı bir alternatif olarak tanıtılır ack
.
$ ag '^\w+\s*\w+\(' ~/build/i3/src
build/i3/src/display_version.c
58:void display_running_version(void) {
build/i3/src/load_layout.c
42:static TAILQ_HEAD(focus_mappings_head, focus_mapping) focus_mappings =
518:json_content_t json_determine_content(const char *filename) {
575:void tree_append_json(Con *con, const char *filename, char **errormsg) {
build/i3/src/x.c
64:CIRCLEQ_HEAD(state_head, con_state) state_head =
67:CIRCLEQ_HEAD(old_state_head, con_state) old_state_head =
70:TAILQ_HEAD(initial_mapping_head, con_state) initial_mapping_head =
97:void x_con_init(Con *con, uint16_t depth) {
...
Size burada gösteremem, ancak çıktı düzgün renklidir. Dosya adlarını zeytin yeşili, satır numaraları altın sarısı ve her satırdaki eşleşen parçayı kan kırmızısı şeklinde alıyorum. Renkler de özelleştirilebilir.