pipe commands inside find -exec?2019 Community Moderator Electionmissing argument to find -execHow to find first match in multiple filesHow does this find command using “find … -exec sh -c '…' sh +” work?Problem combining -or and -exec with find commandConvert order for find … -execHaving issues with FIND commands pruning directoriesCorrect location for piping and redirecting output in find -exec?find -exec ; economyTrying to add multiple grep commands within an execHow to rename a file to have the same name and extension as another file in same directory
What the heck is gets(stdin) on site coderbyte?
Why can't the Brexit deadlock in the UK parliament be solved with a plurality vote?
What is this high flying aircraft over Pennsylvania?
How to make a list of partial sums using forEach
Why does a 97 / 92 key piano exist by Bösendorfer?
How do you justify more code being written by following clean code practices?
Is there a reason to prefer HFS+ over APFS for disk images in High Sierra and/or Mojave?
Quoting Keynes in a lecture
Do you waste sorcery points if you try to apply metamagic to a spell from a scroll but fail to cast it?
How to write Quadratic equation with negative coefficient
Why is the Sun approximated as a black body at ~ 5800 K?
Personal or impersonal in a technical resume
Limit max CPU usage SQL SERVER with WSRM
Why would five hundred and five be same as one?
Given this phrasing in the lease, when should I pay my rent?
When is "ei" a diphthong?
Showing mass murder in a kid's book
Are Captain Marvel's powers affected by Thanos breaking the Tesseract and claiming the stone?
Did I make a mistake by ccing email to boss to others?
How to get directions in deep space?
Does Doodling or Improvising on the Piano Have Any Benefits?
Why do Radio Buttons not fill the entire outer circle?
Would a primitive species be able to learn English from reading books alone?
Pre-Employment Background Check With Consent For Future Checks
pipe commands inside find -exec?
2019 Community Moderator Electionmissing argument to find -execHow to find first match in multiple filesHow does this find command using “find … -exec sh -c '…' sh +” work?Problem combining -or and -exec with find commandConvert order for find … -execHaving issues with FIND commands pruning directoriesCorrect location for piping and redirecting output in find -exec?find -exec ; economyTrying to add multiple grep commands within an execHow to rename a file to have the same name and extension as another file in same directory
Let's suppose I want to find all .txt
files and search for some string. I would do:
find ./ -type f -name "*.txt" -exec egrep -iH 'something' '' ;
What if I want to do a more complex filtering, like this:
egrep something file.txt | egrep somethingelse | egrep other
Inside find -exec? (or similar)
Please keep in mind that I'm searching for a solution that I could easily type when I need it. I know that this could be done with a few lines using a shell script, but that isn't what I'm looking for.
shell find pipe
New contributor
add a comment |
Let's suppose I want to find all .txt
files and search for some string. I would do:
find ./ -type f -name "*.txt" -exec egrep -iH 'something' '' ;
What if I want to do a more complex filtering, like this:
egrep something file.txt | egrep somethingelse | egrep other
Inside find -exec? (or similar)
Please keep in mind that I'm searching for a solution that I could easily type when I need it. I know that this could be done with a few lines using a shell script, but that isn't what I'm looking for.
shell find pipe
New contributor
add a comment |
Let's suppose I want to find all .txt
files and search for some string. I would do:
find ./ -type f -name "*.txt" -exec egrep -iH 'something' '' ;
What if I want to do a more complex filtering, like this:
egrep something file.txt | egrep somethingelse | egrep other
Inside find -exec? (or similar)
Please keep in mind that I'm searching for a solution that I could easily type when I need it. I know that this could be done with a few lines using a shell script, but that isn't what I'm looking for.
shell find pipe
New contributor
Let's suppose I want to find all .txt
files and search for some string. I would do:
find ./ -type f -name "*.txt" -exec egrep -iH 'something' '' ;
What if I want to do a more complex filtering, like this:
egrep something file.txt | egrep somethingelse | egrep other
Inside find -exec? (or similar)
Please keep in mind that I'm searching for a solution that I could easily type when I need it. I know that this could be done with a few lines using a shell script, but that isn't what I'm looking for.
shell find pipe
shell find pipe
New contributor
New contributor
edited 2 days ago
terdon♦
132k32262441
132k32262441
New contributor
asked 2 days ago
1nt3rn3t1nt3rn3t
232
232
New contributor
New contributor
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
If you must do it from within find, you need to call a shell:
find ./ -type f -name "*.txt" -exec sh -c 'grep -EiH something "$1" | grep -E somethingelse | grep -E other' sh ;
Other alternatives include using xargs
instead:
find ./ -type f -name "*.txt" |
xargs -I grep -EiH something |
grep -EiH somethingelse |
grep -EiH other
Or, much safer for arbitrary filenames (assuming your find
supports -print0
):
find ./ -type f -name "*.txt" -print0 |
xargs -0 grep -EiH something |
grep -Ei somethingelse |
grep -Ei other
Or, you could just use a shell loop instead:
find ./ -type f -name "*.txt" -print0 |
while IFS= read -d '' file; do
grep -Ei something "$file" |
grep -Ei somethingelse |
grep -Ei other
done
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
2 days ago
1
... andxargs
could also be used asxargs -I sh -c '...' sh
, if one wanted to (it makes it possible to run parallel jobs with-P
if one wanted to).
– Kusalananda
2 days ago
add a comment |
Edit: This answer is not preferred, but is left here for comparison and illustration of potentially dangerous pitfalls in bash scripting.
You can put bash
(or another shell) as your -exec
command:
find -type -f -name "*.txt" -exec bash -c 'egrep -iH something "" | egrep somethingelse | egrep other' ;
One of the downsides of doing it this way is that it creates more potential for nested quoting issues as your commands get more complex. If you want to avoid that, you can break it out into a for
-loop:
for i in $(find -type -f -name "*.txt"); do
if egrep -iH something "$i" | egrep somethingelse | egrep other; then
echo "Found something: $i"
fi
done
New contributor
1
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
2 days ago
1
Thatfor
loop is a very bad idea.Also known as bash pitfall #1.
– terdon♦
2 days ago
1
This""
in your first command may even lead to code injection. Imagine you got files from me and there's a file literally named" & rm -rf ~ & : ".txt
. Luckily for you-type -f
is invalid, it just saved your home directory. Fix the typo and try again. :) terdon did it right:find … -exec sh -c '… "$1" …' foo ;
.
– Kamil Maciorowski
2 days ago
Thanks for the information! Yeah, the-type -f
is a typo I make constantly when usingfind
, and I didn't notice it in my answer. Whoops. terdon's answer is better, but I'll leave this for comparative purposes.
– trobinson
2 days ago
@terdon: tx for referencing the mywiki.wooledge.org page. It's nice to have a bunch of GPs neatly summarized in one place.
– Cbhihe
yesterday
|
show 1 more comment
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "106"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
1nt3rn3t is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f507023%2fpipe-commands-inside-find-exec%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
If you must do it from within find, you need to call a shell:
find ./ -type f -name "*.txt" -exec sh -c 'grep -EiH something "$1" | grep -E somethingelse | grep -E other' sh ;
Other alternatives include using xargs
instead:
find ./ -type f -name "*.txt" |
xargs -I grep -EiH something |
grep -EiH somethingelse |
grep -EiH other
Or, much safer for arbitrary filenames (assuming your find
supports -print0
):
find ./ -type f -name "*.txt" -print0 |
xargs -0 grep -EiH something |
grep -Ei somethingelse |
grep -Ei other
Or, you could just use a shell loop instead:
find ./ -type f -name "*.txt" -print0 |
while IFS= read -d '' file; do
grep -Ei something "$file" |
grep -Ei somethingelse |
grep -Ei other
done
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
2 days ago
1
... andxargs
could also be used asxargs -I sh -c '...' sh
, if one wanted to (it makes it possible to run parallel jobs with-P
if one wanted to).
– Kusalananda
2 days ago
add a comment |
If you must do it from within find, you need to call a shell:
find ./ -type f -name "*.txt" -exec sh -c 'grep -EiH something "$1" | grep -E somethingelse | grep -E other' sh ;
Other alternatives include using xargs
instead:
find ./ -type f -name "*.txt" |
xargs -I grep -EiH something |
grep -EiH somethingelse |
grep -EiH other
Or, much safer for arbitrary filenames (assuming your find
supports -print0
):
find ./ -type f -name "*.txt" -print0 |
xargs -0 grep -EiH something |
grep -Ei somethingelse |
grep -Ei other
Or, you could just use a shell loop instead:
find ./ -type f -name "*.txt" -print0 |
while IFS= read -d '' file; do
grep -Ei something "$file" |
grep -Ei somethingelse |
grep -Ei other
done
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
2 days ago
1
... andxargs
could also be used asxargs -I sh -c '...' sh
, if one wanted to (it makes it possible to run parallel jobs with-P
if one wanted to).
– Kusalananda
2 days ago
add a comment |
If you must do it from within find, you need to call a shell:
find ./ -type f -name "*.txt" -exec sh -c 'grep -EiH something "$1" | grep -E somethingelse | grep -E other' sh ;
Other alternatives include using xargs
instead:
find ./ -type f -name "*.txt" |
xargs -I grep -EiH something |
grep -EiH somethingelse |
grep -EiH other
Or, much safer for arbitrary filenames (assuming your find
supports -print0
):
find ./ -type f -name "*.txt" -print0 |
xargs -0 grep -EiH something |
grep -Ei somethingelse |
grep -Ei other
Or, you could just use a shell loop instead:
find ./ -type f -name "*.txt" -print0 |
while IFS= read -d '' file; do
grep -Ei something "$file" |
grep -Ei somethingelse |
grep -Ei other
done
If you must do it from within find, you need to call a shell:
find ./ -type f -name "*.txt" -exec sh -c 'grep -EiH something "$1" | grep -E somethingelse | grep -E other' sh ;
Other alternatives include using xargs
instead:
find ./ -type f -name "*.txt" |
xargs -I grep -EiH something |
grep -EiH somethingelse |
grep -EiH other
Or, much safer for arbitrary filenames (assuming your find
supports -print0
):
find ./ -type f -name "*.txt" -print0 |
xargs -0 grep -EiH something |
grep -Ei somethingelse |
grep -Ei other
Or, you could just use a shell loop instead:
find ./ -type f -name "*.txt" -print0 |
while IFS= read -d '' file; do
grep -Ei something "$file" |
grep -Ei somethingelse |
grep -Ei other
done
edited 2 days ago
Kusalananda
136k17257426
136k17257426
answered 2 days ago
terdon♦terdon
132k32262441
132k32262441
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
2 days ago
1
... andxargs
could also be used asxargs -I sh -c '...' sh
, if one wanted to (it makes it possible to run parallel jobs with-P
if one wanted to).
– Kusalananda
2 days ago
add a comment |
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
2 days ago
1
... andxargs
could also be used asxargs -I sh -c '...' sh
, if one wanted to (it makes it possible to run parallel jobs with-P
if one wanted to).
– Kusalananda
2 days ago
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
2 days ago
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
2 days ago
1
1
... and
xargs
could also be used as xargs -I sh -c '...' sh
, if one wanted to (it makes it possible to run parallel jobs with -P
if one wanted to).– Kusalananda
2 days ago
... and
xargs
could also be used as xargs -I sh -c '...' sh
, if one wanted to (it makes it possible to run parallel jobs with -P
if one wanted to).– Kusalananda
2 days ago
add a comment |
Edit: This answer is not preferred, but is left here for comparison and illustration of potentially dangerous pitfalls in bash scripting.
You can put bash
(or another shell) as your -exec
command:
find -type -f -name "*.txt" -exec bash -c 'egrep -iH something "" | egrep somethingelse | egrep other' ;
One of the downsides of doing it this way is that it creates more potential for nested quoting issues as your commands get more complex. If you want to avoid that, you can break it out into a for
-loop:
for i in $(find -type -f -name "*.txt"); do
if egrep -iH something "$i" | egrep somethingelse | egrep other; then
echo "Found something: $i"
fi
done
New contributor
1
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
2 days ago
1
Thatfor
loop is a very bad idea.Also known as bash pitfall #1.
– terdon♦
2 days ago
1
This""
in your first command may even lead to code injection. Imagine you got files from me and there's a file literally named" & rm -rf ~ & : ".txt
. Luckily for you-type -f
is invalid, it just saved your home directory. Fix the typo and try again. :) terdon did it right:find … -exec sh -c '… "$1" …' foo ;
.
– Kamil Maciorowski
2 days ago
Thanks for the information! Yeah, the-type -f
is a typo I make constantly when usingfind
, and I didn't notice it in my answer. Whoops. terdon's answer is better, but I'll leave this for comparative purposes.
– trobinson
2 days ago
@terdon: tx for referencing the mywiki.wooledge.org page. It's nice to have a bunch of GPs neatly summarized in one place.
– Cbhihe
yesterday
|
show 1 more comment
Edit: This answer is not preferred, but is left here for comparison and illustration of potentially dangerous pitfalls in bash scripting.
You can put bash
(or another shell) as your -exec
command:
find -type -f -name "*.txt" -exec bash -c 'egrep -iH something "" | egrep somethingelse | egrep other' ;
One of the downsides of doing it this way is that it creates more potential for nested quoting issues as your commands get more complex. If you want to avoid that, you can break it out into a for
-loop:
for i in $(find -type -f -name "*.txt"); do
if egrep -iH something "$i" | egrep somethingelse | egrep other; then
echo "Found something: $i"
fi
done
New contributor
1
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
2 days ago
1
Thatfor
loop is a very bad idea.Also known as bash pitfall #1.
– terdon♦
2 days ago
1
This""
in your first command may even lead to code injection. Imagine you got files from me and there's a file literally named" & rm -rf ~ & : ".txt
. Luckily for you-type -f
is invalid, it just saved your home directory. Fix the typo and try again. :) terdon did it right:find … -exec sh -c '… "$1" …' foo ;
.
– Kamil Maciorowski
2 days ago
Thanks for the information! Yeah, the-type -f
is a typo I make constantly when usingfind
, and I didn't notice it in my answer. Whoops. terdon's answer is better, but I'll leave this for comparative purposes.
– trobinson
2 days ago
@terdon: tx for referencing the mywiki.wooledge.org page. It's nice to have a bunch of GPs neatly summarized in one place.
– Cbhihe
yesterday
|
show 1 more comment
Edit: This answer is not preferred, but is left here for comparison and illustration of potentially dangerous pitfalls in bash scripting.
You can put bash
(or another shell) as your -exec
command:
find -type -f -name "*.txt" -exec bash -c 'egrep -iH something "" | egrep somethingelse | egrep other' ;
One of the downsides of doing it this way is that it creates more potential for nested quoting issues as your commands get more complex. If you want to avoid that, you can break it out into a for
-loop:
for i in $(find -type -f -name "*.txt"); do
if egrep -iH something "$i" | egrep somethingelse | egrep other; then
echo "Found something: $i"
fi
done
New contributor
Edit: This answer is not preferred, but is left here for comparison and illustration of potentially dangerous pitfalls in bash scripting.
You can put bash
(or another shell) as your -exec
command:
find -type -f -name "*.txt" -exec bash -c 'egrep -iH something "" | egrep somethingelse | egrep other' ;
One of the downsides of doing it this way is that it creates more potential for nested quoting issues as your commands get more complex. If you want to avoid that, you can break it out into a for
-loop:
for i in $(find -type -f -name "*.txt"); do
if egrep -iH something "$i" | egrep somethingelse | egrep other; then
echo "Found something: $i"
fi
done
New contributor
edited 21 hours ago
New contributor
answered 2 days ago
trobinsontrobinson
443
443
New contributor
New contributor
1
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
2 days ago
1
Thatfor
loop is a very bad idea.Also known as bash pitfall #1.
– terdon♦
2 days ago
1
This""
in your first command may even lead to code injection. Imagine you got files from me and there's a file literally named" & rm -rf ~ & : ".txt
. Luckily for you-type -f
is invalid, it just saved your home directory. Fix the typo and try again. :) terdon did it right:find … -exec sh -c '… "$1" …' foo ;
.
– Kamil Maciorowski
2 days ago
Thanks for the information! Yeah, the-type -f
is a typo I make constantly when usingfind
, and I didn't notice it in my answer. Whoops. terdon's answer is better, but I'll leave this for comparative purposes.
– trobinson
2 days ago
@terdon: tx for referencing the mywiki.wooledge.org page. It's nice to have a bunch of GPs neatly summarized in one place.
– Cbhihe
yesterday
|
show 1 more comment
1
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
2 days ago
1
Thatfor
loop is a very bad idea.Also known as bash pitfall #1.
– terdon♦
2 days ago
1
This""
in your first command may even lead to code injection. Imagine you got files from me and there's a file literally named" & rm -rf ~ & : ".txt
. Luckily for you-type -f
is invalid, it just saved your home directory. Fix the typo and try again. :) terdon did it right:find … -exec sh -c '… "$1" …' foo ;
.
– Kamil Maciorowski
2 days ago
Thanks for the information! Yeah, the-type -f
is a typo I make constantly when usingfind
, and I didn't notice it in my answer. Whoops. terdon's answer is better, but I'll leave this for comparative purposes.
– trobinson
2 days ago
@terdon: tx for referencing the mywiki.wooledge.org page. It's nice to have a bunch of GPs neatly summarized in one place.
– Cbhihe
yesterday
1
1
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
2 days ago
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
2 days ago
1
1
That
for
loop is a very bad idea.Also known as bash pitfall #1.– terdon♦
2 days ago
That
for
loop is a very bad idea.Also known as bash pitfall #1.– terdon♦
2 days ago
1
1
This
""
in your first command may even lead to code injection. Imagine you got files from me and there's a file literally named " & rm -rf ~ & : ".txt
. Luckily for you -type -f
is invalid, it just saved your home directory. Fix the typo and try again. :) terdon did it right: find … -exec sh -c '… "$1" …' foo ;
.– Kamil Maciorowski
2 days ago
This
""
in your first command may even lead to code injection. Imagine you got files from me and there's a file literally named " & rm -rf ~ & : ".txt
. Luckily for you -type -f
is invalid, it just saved your home directory. Fix the typo and try again. :) terdon did it right: find … -exec sh -c '… "$1" …' foo ;
.– Kamil Maciorowski
2 days ago
Thanks for the information! Yeah, the
-type -f
is a typo I make constantly when using find
, and I didn't notice it in my answer. Whoops. terdon's answer is better, but I'll leave this for comparative purposes.– trobinson
2 days ago
Thanks for the information! Yeah, the
-type -f
is a typo I make constantly when using find
, and I didn't notice it in my answer. Whoops. terdon's answer is better, but I'll leave this for comparative purposes.– trobinson
2 days ago
@terdon: tx for referencing the mywiki.wooledge.org page. It's nice to have a bunch of GPs neatly summarized in one place.
– Cbhihe
yesterday
@terdon: tx for referencing the mywiki.wooledge.org page. It's nice to have a bunch of GPs neatly summarized in one place.
– Cbhihe
yesterday
|
show 1 more comment
1nt3rn3t is a new contributor. Be nice, and check out our Code of Conduct.
1nt3rn3t is a new contributor. Be nice, and check out our Code of Conduct.
1nt3rn3t is a new contributor. Be nice, and check out our Code of Conduct.
1nt3rn3t is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f507023%2fpipe-commands-inside-find-exec%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown