Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I was wanting to run a find and then execute a script on each match; however, I was wanting to print the name of the matched file above the output from each exec. How can I produce the following output:

$ find . -name 'something' -exec sh script.sh {} \;
output from 
script.sh something_1
output from
script.sh something_2

I am currently only getting the output from script.sh. I tried -exec echo {} && sh script.sh {} \; with no success.

I would prefer a solution using -exec or xargs -print0, i.e., not prone to problems with white space.

share|improve this question
If you can modify script.sh, the do so to make it emit the file it operates on just as it start. If you can not, make a wrapper.sh which emits the output and calls script.sh. If your script can take multiple file names as arguments then you should investigate xargs, eg find -find_options | xargs script.sh – Johan Mar 1 '13 at 5:17

find prints all matching files by default if you don't specify any other action.

When you do -exec ..., it replaces the -print.

When you put two actions next to each other, it means AND.

So just do both:

$ find . -name 'something' -print -exec sh script.sh {} \;
share|improve this answer

Try doing this :

$ find . -name 'something' -exec sh script.sh {} \; |
    script.sh |
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.