Question

I am searching through a Git repository and would like to include the .git folder.

grep does not include this folder if I run

grep -r search *

What would be a grep command to include this folder?

Was it helpful?

Solution

Please refer to the solution at the end of this post as a better alternative to what you're doing.

You can explicitly include hidden files (a directory is also a file).

grep -r search * .*

The * will match all files except hidden ones and .* will match only hidden files. However this will fail if there are either no non-hidden files or no hidden files in a given directory. You could of course explicitly add .git instead of .*.

However, if you simply want to search in a given directory, do it like this:

grep -r search .

The . will match the current path, which will include both non-hidden and hidden files.

OTHER TIPS

I just ran into this problem, and based on @bitmask's answer, here is my simple modification to avoid the problem pointed out by @sehe:

grep -r search_string * .[^.]*

Perhaps you will prefer to combine "grep" with the "find" command for a complete solution like:

find . -exec grep -Hn search {} \;

This command will search inside hidden files or directories for string "search" and list any files with a coincidence with this output format:

File path:Line number:line with coincidence

./foo/bar:42:search line
./foo/.bar:42:search line
./.foo/bar:42:search line
./.foo/.bar:42:search line

You may want to use this approach, assuming you're searching the current directory (otherwise replace . with the desired directory):

find . -type f | xargs grep search

or if you just want to search at the top level (which is quicker to test if you're trying these out):

find . -type f -maxdepth 1 | xargs grep search

UPDATE: I modified the examples in response to Scott's comments. I also added "-type f".

To search within ONLY all hidden files and directories from your current location:

find . -name ".*" -exec grep -rs search {} \;

ONLY all hidden files:

find . -name ".*" -type f -exec grep -s search {} \;

ONLY all hidden directories:

find . -name ".*" -type d -exec grep -rs search {} \;

All the other answers are better. This one might be easy to remember:

find . -type f | xargs grep search

It finds only files (including hidden) and greps each file.

To find only within a certain folder you can use:

ls -al | grep " \."

It is a very simple command to list and pipe to grep.

To prevent matching . and .. which are not hidden files, you can use grep with ls -A like in this example:

ls -A | grep "^\."

^\. states that the first character must be .

The -A or --almost-all option excludes the results . and .. so that only hidden files and directories are matched.

In addition to Tyler's suggestion, Here is the command to grep all files and folders recursively including hidden files

find . -name "*.*" -exec grep -li 'search' {} \;

You can also search for specific types of hidden files like so for hidden directory files:

grep -r --include=*.directory "search-string"

This may work better than some of the other options. The other options that worked can be too slow.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top