How do I "ls -R | cat | grep print" ?
Hi friends! π€ I am on a gnulinux and trying to list all files in the active directory and it's subdirectories. I then want to pipe the output to "cat". I want to pipe the output from cat into grep.
Please help! π
Note, you almost never have to use cat. Just leaving it out would have been enough to find your file (although find is still better).
When you want to find a string in a file it's also enough to use grep string file
instead of cat file | grep string
. You can even search through multiple files with grep string file1 file2 file*
and grep will tell you in which file the string was found.
So I could use something like grep string -R * to find any occurrence of the string in any files in the folder and sub-folders.
thank you!
grep -r string .
The flag should go before the pattern.
-r
to search recursively, .
refers to the current directory.
Why use .
instead of *
? Because on it's own, *
will (typically) not match hidden files. See the last paragraph of the 'Origin' section of: https://en.m.wikipedia.org/wiki/Glob_(programming). Technically your ls
command (lacking the -a
) flag would also skip hidden files, but since your comment mentions finding the string in 'any files,' I figured hidden files should also be covered (the find
commands listed would also find the hidden files).
EDIT: Should have mentioned that -R
is also recursive, but will follow symlinks, where -r
will ignore them.
To answer your og question since it is a valuable tool to know about, xargs.
ls | xargs cat | grep print
Should do what you want. Unless your file names have spaces, then you should probably not use this.
find -print0 | xargs -0 can handle spaces
Edit and you probably want xargs --exec instead of piping after
It's valuable to learn how to do an inline loop
ls | while read A; do cat $A | grep print; done
This will read each line of ls into variable A, then it'll get and grep each one.
grep -r print .
I.e. Grep on print
recursively from .
(current directory)
Or for more advance search
find . -name "*.sh" -exec grep -H print {} \;
I.e find all files with sh extension and run grep on it ({}
become the filename). -H
to include filename in output.