Jag vill lista de filer rekursivt och unikt som innehåller det givna ordet.

Exempel : Sök efter ordet ”check”, jag brukar göra är en grep

$ grep check * -R 

Men eftersom det finns många förekomster av detta ord får jag mycket utdata. Så jag behöver bara lista filnamnen som innehåller det angivna sökordet. Jag antar att något trick med find och xargs skulle räcka här, men inte säker.

Några idéer?

Svar

Använd -l eller --files-with-matches alternativ som är dokumenterat enligt följande:

Dämpa normal utgång; istället skriva ut namnet på varje inmatningsfil från vilken utdata normalt skulle ha skrivits ut. Skanningen stoppas vid första matchen. (-l anges av POSIX.)

Så för ditt exempel kan du använda följande:

$ grep check * -lR 

Kommentarer

  • Fungerar också på MSYS. Bra!
  • Jag använde grep -rl "text to find" "/usr/share" och det fungerade bra!

Svar

find . -type f -exec grep -l check {} + 

Du vill antagligen inte använda alternativet -R som med moderna versioner av GNU grep följer symlänkar vid fallande kataloger. Använd alternativet -r istället där som sedan version 2.12 (april 2012) inte längre följer symlänkar.

Om din grep inte är GNU-en, eller är äldre än version 2.12, eller om du behöver din kod för att vara portabel till icke-blödande-GNU-system, använd find kommando ovan.

Annars kan du göra:

grep -rl check . 

Använd inte * (eftersom det skulle utelämna dolda filer i den aktuella katalogen (och endast i den aktuella katalogen) och skulle orsaka problem för filer vars namn börjar med en -), undvik att skicka alternativ efter argument eftersom det inte är garanti börja arbeta beroende på miljö och är inte bärbar.

Svar

Prova detta:

find . -type f | xargs grep -c check $1 | grep -v ":0" 

Vad gäller grep flaggor …

-c returnera ett filnamn följt av: och ett nummer som anger hur många gånger söksträngen visas i den givna filen.

-v tar utdata från den första grep sök, filtrera bort filerna med noll resultat och skriv ut bara filer med resultat som inte är noll.

Kommentarer

  • Detta får ett falskt negativt om du har fil (er) (eller regissör (er)) vars namn innehåller :0. Det ' är bättre att göra grep -v ':0$'. Även det kommer att kvävas på sökvägar som innehåller nya rader.

Svar

grep -lR "text-to-find" <where-to-find> fungerar också bra.

t.ex. grep -lR "NAVIGATE" . där vi hittar ordet NAVIGATE i . i den aktuella katalogen.

Svar

grep -rin ”whatToFind” locationToFInd

t.ex. $ grep -rin ”vihaan”.

kommer rekursivt att söka och lista filnamn och motsvarande rader som har ”vihaan” i sig, ”.” refererar till den aktuella katalogen.

Svar

find . -type f | grep "keyword" * 

sök i aktuell katalog. Om du vill söka från rot anger du / istället för .

Svar

 grep -rli trim \` find . -name *.q \` 

Ge dig listan över .q filer innehåller nyckelordet trim

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *