How to use grep on all files non-recursively in a directory?
In Bash, a glob will not expand into hidden files, so if you want to search all the files in a directory, you need to specify hidden files .*
and non-hidden *
.
To avoid the "Is a directory" errors, you could use -d skip
, but on my system I also get an error grep: .gvfs: Permission denied
†, so I suggest using -s
, which hides all error messages.
So the command you are looking for is:
grep -s "string" * .*
If you are searching files in another dir:
grep -s "string" /path/to/dir/{*,.*}
Another option is to use the dotglob
shell option, which will make a glob include hidden files.
shopt -s dotglob
grep -s "string" *
For files in another dir:
grep -s "string" /path/to/dir/*
† Someone mentioned that I shouldn't get this error. They may be right - I did some reading but couldn't make heads or tails of it myself.
You need the -d skip
option added on.
Grep is searching inside of files. You can search recursively, as you said, if you want to search files inside of a directory.
By default, grep will read all files, and it detects the directories. Because by default you have not defined what to do with the directories with the
-d
option, it give error output.Searching just within the parent directory would be
grep -d skip "string" ./*
Old timers would probably do this:
find . -type f -print0 | xargs -0 grep "string"