This one is a quick one. I have about 25,000 files in a directory that I need to grep across. I tried:

grep '"class":0' *.json | more
zsh: argument list too long: grep

That's a problem because when the argument list is too long, nothing can happen. The solution here is a combination of find and xargs, specifically:

find . -name '*.json' | xargs grep '"class":0'

Here's the output from this:

./davidson-data-266118b4178f11ea80474c3275928de7.json:{"count":3,"hate_speech":3,"offensive_speech":0,"neither":0,"class":0,"tweet":"\"@JPantsdotcom @Todd__Kincannon @the__realtony I'm partial

You should be able to use an approach like this:

find -name '*.json' -exec grep '"class":0' 

but the embedded grep in find doesn't accept that and fails with this error:

find: illegal option -- n
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
       find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]

The closest that I can get to make this work is:

find . -name '*.json' -exec grep 'class' {} +

and that's not an exact match so, sigh.

If we return to the original approach and add a -l option flag then we can list only filenames:

find . -name '*.json' | xargs grep -l '"class":0'

See Also