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
Fair way to split coins
Single word to change groups
Justification failure in beamer enumerate list
TDE Master Key Rotation
Is there any common country to visit for uk and schengen visa?
pipe commands inside find -exec?
is this saw blade faulty?
Weird lines in Microsoft Word
Imaginary part of expression too difficult to calculate
Is xar preinstalled on macOS?
DisplayForm problem with pi in FractionBox
Can other pieces capture a threatening piece and prevent a checkmate?
Why didn’t Eve recognize the little cockroach as a living organism?
Recursively updating the MLE as new observations stream in
Can a university suspend a student even when he has left university?
Would this string work as string?
Is VPN a layer 3 concept?
Why doesn't the chatan sign the ketubah?
What are the rules for concealing thieves' tools (or items in general)?
How can an organ that provides biological immortality be unable to regenerate?
Should I be concerned about student access to a test bank?
Writing in a Christian voice
Have the tides ever turned twice on any open problem?
Have any astronauts/cosmonauts died in space?
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 10 hours ago
terdon♦
132k32262441
132k32262441
New contributor
asked 10 hours ago
1nt3rn3t1nt3rn3t
132
132
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
9 hours ago
... 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
9 hours ago
add a comment |
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
9 hours ago
Thatfor
loop is a very bad idea.Also known as bash pitfall #1.
– terdon♦
9 hours 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
9 hours 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
6 hours ago
add a 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
9 hours ago
... 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
9 hours 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
9 hours ago
... 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
9 hours 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 9 hours ago
Kusalananda
136k17257425
136k17257425
answered 10 hours 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
9 hours ago
... 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
9 hours 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
9 hours ago
... 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
9 hours ago
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
9 hours ago
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
9 hours 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
9 hours 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
9 hours ago
add a comment |
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
9 hours ago
Thatfor
loop is a very bad idea.Also known as bash pitfall #1.
– terdon♦
9 hours 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
9 hours 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
6 hours ago
add a comment |
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
9 hours ago
Thatfor
loop is a very bad idea.Also known as bash pitfall #1.
– terdon♦
9 hours 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
9 hours 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
6 hours ago
add a comment |
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
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
New contributor
answered 10 hours ago
trobinsontrobinson
461
461
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
9 hours ago
Thatfor
loop is a very bad idea.Also known as bash pitfall #1.
– terdon♦
9 hours 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
9 hours 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
6 hours ago
add a 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
9 hours ago
Thatfor
loop is a very bad idea.Also known as bash pitfall #1.
– terdon♦
9 hours 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
9 hours 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
6 hours ago
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
9 hours ago
The first one is exactly what I was looking for. Extremely simple and small enough to type depending on my needs. Thanks.
– 1nt3rn3t
9 hours ago
That
for
loop is a very bad idea.Also known as bash pitfall #1.– terdon♦
9 hours ago
That
for
loop is a very bad idea.Also known as bash pitfall #1.– terdon♦
9 hours 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
9 hours 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
9 hours 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
6 hours 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
6 hours ago
add a 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