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
Unfrosted light bulb
Writing in a Christian voice
Print a physical multiplication table
Was World War I a war of liberals against authoritarians?
Why doesn't the fusion process of the sun speed up?
Do people actually use the word "kaputt" in conversation?
Nested Dynamic SOQL Query
What is the reasoning behind standardization (dividing by standard deviation)?
Why didn’t Eve recognize the little cockroach as a living organism?
Have any astronauts/cosmonauts died in space?
Turning a hard to access nut?
The English Debate
What will the Frenchman say?
"Marked down as someone wanting to sell shares." What does that mean?
Do native speakers use "ultima" and "proxima" frequently in spoken English?
What kind of footwear is suitable for walking in micro gravity environment?
Which partition to make active?
What is the difference between something being completely legal and being completely decriminalized?
How can an organ that provides biological immortality be unable to regenerate?
How can a new country break out from a developed country without war?
Do I need an EFI partition for each 18.04 ubuntu I have on my HD?
Jem'Hadar, something strange about their life expectancy
Symbolism of 18 Journeyers
Friend wants my recommendation but I don't want to give it to him
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 13 hours ago
terdon♦
132k32262441
132k32262441
New contributor
asked 13 hours ago
1nt3rn3t1nt3rn3t
182
182
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
13 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
12 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
12 hours ago
Thatfor
loop is a very bad idea.Also known as bash pitfall #1.
– terdon♦
12 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
12 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
9 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
13 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
12 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
13 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
12 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 12 hours ago
Kusalananda
136k17257425
136k17257425
answered 13 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
13 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
12 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
13 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
12 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
13 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
13 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
12 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
12 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
12 hours ago
Thatfor
loop is a very bad idea.Also known as bash pitfall #1.
– terdon♦
12 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
12 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
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
12 hours ago
Thatfor
loop is a very bad idea.Also known as bash pitfall #1.
– terdon♦
12 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
12 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
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
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 13 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
12 hours ago
Thatfor
loop is a very bad idea.Also known as bash pitfall #1.
– terdon♦
12 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
12 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
9 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
12 hours ago
Thatfor
loop is a very bad idea.Also known as bash pitfall #1.
– terdon♦
12 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
12 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
9 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
12 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
12 hours ago
That
for
loop is a very bad idea.Also known as bash pitfall #1.– terdon♦
12 hours ago
That
for
loop is a very bad idea.Also known as bash pitfall #1.– terdon♦
12 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
12 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
12 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
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
9 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