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
- Kapcsolódó (a Kérdezze meg az Ubuntut ): Rekurzív módon kereshet mintát / szöveget csak egy könyvtár megadott fájlnevében?
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 egygrep
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.