I have 2 bash functions catall and grepall
catall
works fine, catting every file it finds with the file name printed first, then the content and a new line
catall ()
{
find . -name $1 | xargs -I % sh -c 'echo %; cat %; echo"" '
}
grepall ()
{
find . -name $1 | xargs -I % sh -c 'echo %; cat % | grep $2; echo"" '
}
But grepall
doesn't work, is should do the same as catall
but with a grep stage on the content of the file
Why is $2
not sub'ed
Can you make this grepall work ?
It is because you are forking a new shell process using
sh -c
and all the variable of parent shell are not available in child shell unless you export them.Use this function to make it work:
It works now because we are creating an exported variable
p
which becomes available in sub shell also.Since you are forking a new shell anyway you don't really need to call
xargsa
asfind
can do the job for you: