I run command to search for phrase in all files:
cat *.* | grep blabla
It works fine but I got problem with hidden files and directories. Command simply not deals with them. Ho to solve this problem?
I run command to search for phrase in all files:
cat *.* | grep blabla
It works fine but I got problem with hidden files and directories. Command simply not deals with them. Ho to solve this problem?
By default, hidden files (i.e. those starting with a period) are excluded from the bash shell's glob expansion. However you can alter that using the dotglob
setting e.g.
$ mkdir dir
$ touch dir/.hidden dir/visible
$ echo dir/*
dir/visible
$ shopt -s dotglob
$ echo dir/*
dir/.hidden dir/visible
You can unset the option afterwards with shopt -u dotglob
Use find
command with logical OR flag (-o
) and -exec . . .\+
flag
find . -maxdepth 1 \( -iname "*.*" -o -iname ".*" \) -exec grep "MySearchTerm" {} \+
Explanation:
find
is a recursive command that searches files in specified directory. In this case , it is .
the current working directory.-maxdepth
flag tells us to stay only in current directory. If you want to go recursivelly or specify how many subdirectories to descent, change 1
to number of levels you wanna go.\( . . .\)
part prevents shell of treating that as subshell, rather treating it as grouping of arguments to find
.-iname
flags allow specifying for which filenames to search.-o
flag will tell find to search for files *.*
or files that start with leading dot , the hidden files.-exec . . .{}
structure allows running specific command to operate on files found. \+
will tell find
to take all the files as arguments for the command you want to run, in this case grep
.Here's a small example, where you can see SEARCHFILE.txt
and .SEARCHFILE.txt
are both found:
DIR:/xieerqi
skolodya@ubuntu:$ find . -maxdepth 1 \( -iname "*.*" -o -iname ".*" \) -exec grep "HelloWorld" {} \+ 2>/dev/null
./SEARCHFILE.txt:HelloWorld ! I'm found
./localDir.txt:HelloWorld.so
./localDir.txt:HelloWorld.c
Binary file ./2015-05-05-raspbian-wheezy.img matches
./.SEARCHFILE.txt:HelloWorld ! I'm found
"Hidden files" are simply files whose name starts with a dot. In GUIs applications these files are usually not shown, whence their name.
You can use shell globbing:
cat {*,.*} | grep blabla
The previous command include all files with no dot (*
) and all files that start with a dot (.*
).
By the way, this is an useless use of cat, and you should instead write your command as:
grep blabla {*,.*}
.
and ..
, which sometimes may have unwanted effects. And it generates warnings if there are only hidden files.
– user23013
Jan 21 '16 at 21:23
cat * .* | grep blabla
/ grep 'blabla' * .*
.
– kos
Jan 22 '16 at 02:59
file1.txt
AND.bashrc
? – Sergiy Kolodyazhnyy Jan 21 '16 at 15:10cat
from hidden files you'll have to eliminate that first*
. You could do something likecat *.* | grep blabla && cat .* | grep blabla
. By the way, if you want tocat
all the files in a directory you could simple usecat *
. – Eduardo Cola Jan 21 '16 at 15:15cat *.* | grep blabla; cat .* | grep blabla
; in your command, if the first command exits with a nonzero status the second won't be executed, which is not what you want. But there's a better method for this -- please see my answer below. – dr_ Jan 21 '16 at 15:50cat
. It will actually concatenate the files and pipe the concatenated result togrep
. You could not have used<*
in place of it. Andgrep blabla *
would produce a different result, because it will include the name of each file in the output, which would not happen withcat
. If you can remember thatgrep
has a-h
option, you can avoid usingcat
. But if you don't recall that option it may well be faster to usecat
than to look it up in thegrep
man page. – kasperd Jan 22 '16 at 09:11*.*
is really what you wanted to write in the first place? It will match entries which have a.
in their name but skip all those with no.
in their name. I think what you really wanted was*
. – kasperd Jan 22 '16 at 09:13