Ezt sokat használtam, a javítás, amelyet megpróbálok elérni, az az, hogy elkerüljem az echo fájlneveket, amelyek nem illenek grep. Jobb módszer erre?

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

Megjegyzések

Válasz

 find . -name "*.py" -exec grep something {} \; -print  

kinyomtatná a fájlnevet a megfelelő sorok után .

 find . -name "*.py" -exec grep something /dev/null {} +  

minden illeszkedő sor elé kinyomtatja a fájl nevét (ehhez hozzáadjuk a /dev/null fájlt, ha csak egy megfelelő fájl grep néven nem nyomtatja ki a fájl nevét, ha csak egy fájlt adott át keresésre. A grep egy -H opcióval rendelkezik alternatívaként).

 find . -name "*.py" -exec grep -l something {} +   

csak azoknak a fájloknak a fájlneveit nyomtatja ki, amelyeknek legalább egy egyező sora van.

A fájlnév előtti kinyomtatásához az egyező sorokat használhatja az awk ehelyett:

 find . -name "*.py" -exec awk " FNR == 1 {filename_printed = 0} /something/ { if (!filename_printed) { print FILENAME filename_printed = 1 } print }" {} +  

Vagy hívja a grep kétszer minden fájlhoz - bár ez "d kevésbé hatékony, mivel futtatna legalább egy grep parancsot, és legfeljebb kettőt minden fájlhoz (és kétszer olvassa el a fájl tartalmát ):

 find . -name "*.py" -exec grep -l something {} \; \ -exec grep something {} \;  

Mindenesetre nem akarod a find ilyen kimenetét áttekinteni , és ne felejtsd el idézni a változók .

Ha shell-ciklust akart használni, GNU eszközökkel:

 find . -name "*.py" -exec grep -l --null something {} + | xargs -r0 sh -c " for file do printf "%s\n" "$file" grep something < "$file" done" sh  

(a FreeBSD-n és a derivatívákon is működik).

Válasz

I Ha a GNU grep-et használja, használhatja annak -r vagy --recursive opcióját, hogy ezt az egyszerű keresést elvégezze az Ön számára:

 grep -r --include "*.py" -le "$regexp" ./ # for filenames only grep -r --include "*.py" -He "$regexp" ./ # for filenames on each match  

Csak akkor kell find, ha szüksége van fejlettebb predikátumok.

Megjegyzések

  • A GNU verziójától függően grep, grep előfordulhat, hogy nem néz be a szimpla linkekbe, vagy áthalad a címtárakba mutató szimbolikus linkekbe. Találhat néhány változatot más, nem szabályos fájlok kezelésében is.

Válasz

Ön megmondhatja a grep-nek, hogy a kimenetbe foglalja a fájlnevet. Tehát ha van egyezés, akkor az megjelenik a konzolon; ha egy fájlban nincs egyezés, akkor a fájl nem nyomtat sort.

find . -name "*.py" | xargs grep -n -H something 

A 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. 

Ha a fájlokban lehetnek nevek, amelyekben szóköz van, akkor át kell váltani a NUL karakterek elválasztóként való használatához. A teljes parancs most így fog kinézni:

find . -name "*.py" -print0 | xargs -0 grep -n -H something 

Válasz

Megadhatja próbálkozzon valami hasonlóval:

find . -name "*.py:" -exec grep -l {} \; 

Ez az exec grep parancs minden fájlhoz, amelyet a find parancs és a szokásos find parancs funkció fedezett fel

Válasz

Használja a -l argumentumot.

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

További keresési mód:

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

Válasz

Ott grep olyan alternatívák, amelyek alapértelmezés szerint a kívánt formátumban adják ki az eredményeiket. A 2 legnépszerűbb, amelyekről tudom, hogy ag (más néven: "az ezüst kereső") és ack. A ag hirdetést a ack gyorsabb alternatívájaként hirdetik.

$ 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) { ... 

Itt nem tudom megmutatni, de a kimenet szép színű. A fájlneveket olajzöld színnel, a sorszámokat aranysárgával, az egyes sorok illesztett darabjait pedig vérvörös színnel látom. A színek testreszabhatók.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük