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! 😅
Use
find
instead.Seconded, but I always have to look up the syntax. --type=file --name=“string”?
Thank you! 🤩
Bro you can just run
find
thanks dude
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 ofcat file | grep string
. You can even search through multiple files withgrep string file1 file2 file*
and grep will tell you in which file the string was found.Obligatory link to the Useless Use of Cat Awards
for a moment, I thought OP was looking for cat photos or something.
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 yourls
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 (thefind
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.TIL
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
thank you
I think you can just do
grep print **/*
.ty
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.
thank you
ripgrep
does exactly what you wantI just pipe to
more
and filter with /deleted by creator
ty
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.this is great ty!