dosya adlarını yalnızca kalıp bulundu ile bul ve yankıla


Yanıtlar:


24
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/nullyalnızca bir eşleşen dosyanın olduğu durum için ekleriz grep. GNU uygulamasının grepbunun için bir -Hseç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 grepher dosya için iki kez arayın - ancak en az bir grepkomut 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 findbö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).


6

GNU grep kullanıyorsanız, bu basit bulguyu sizin için yapmak için onun -rveya --recursiveseç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 finddaha gelişmiş tahminlere ihtiyacınız varsa gerekir.


1
GNU sürümüne bağlı olarak grep, grepya 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.
Stéphane Chazelas

5

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

1

Şö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


1

-lArgümanı kullanın .

for file in `find . -name "*.py"`; do grep -l something $file && grep something $file; done

Daha gevrek bir kullanım:

for file in $(find . -name '*.py' -exec grep -l something '{}' +); do echo "$file"; grep something $file; done

1

Orada grepvarsayı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. agdaha 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.

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.