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.txtAND.bashrc? – Sergiy Kolodyazhnyy Jan 21 '16 at 15:10catfrom 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 tocatall 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 thatgrephas a-hoption, you can avoid usingcat. But if you don't recall that option it may well be faster to usecatthan to look it up in thegrepman 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