Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I thought the following two commands would output the same thing, but they don't:

Command 1:

find . -name filename -exec print '{}' \;

Command 2:

find . -name filename -exec echo '{}' \;

In fact, Command 2 works as I expected it to work: it prints the relative path to all instances of filename under .

However, for Command 1 I get as many lines in the output as I get for Command 2, but instead of giving me the path, each line says:

find: print: No such file or directory

I have also tried removing the quotes fron {}.

Why doesn't the second command work as I expected it to work? And why does it fail to print the path to each instance of filename?

share|improve this question
1  
print isn't actually a standard command anywhere, and if it does exist it most likely is not a synonym for echo. From the error message you get, your system doesn't seem to have print in the path at all. find can -print file names for you without needing an external command anyways. Both commands you've listed are poor usage and could be replaced with a simple find -name filename since -print is the default action for find. –  jw013 Oct 6 '11 at 21:13

2 Answers 2

up vote 4 down vote accepted

Contrast:

% whence -a print
print
% whence -a echo
echo
/bin/echo

This shows that print only exists as a built-in, whereas echo exists both as a built-in and an executable. (Actually, going by what's shown above, print and echo could be aliases, functions or reserved words; use whence -w to see precisely what type of internal object a name represents.)

find is an external command, so it can't invoke any shell built-in. If you really need to invoke your shell's built-ins, invoke a shell explictly:

find . -name filename -exec zsh -c 'print "$0"' '{}' \;

In this case, I don't think you want zsh's print built-in: find's -print primary will do the job, only properly (the zsh print built-in expands backslashes).

find . -name filename -print

(You can even leave out the -print here, because -print is the default action for find when no action is specified.)

The reason why there is an echo external executable but none called print is that echo is a standard command, so it's given maximum availability even to programs that want to invoke it without going via a shell. In contrast, print is specific to zsh, so only zsh scripts use it in the first place.

(Oh, and on my system, there is a print command, which sends files to the printer.)

share|improve this answer

find searches the PATH for a command which matches whatever you specify with '-exec'. echo is a actually a binary on your system (for me it's /bin/each).

print, by contrast is not a binary located on your system, but rather a shell-builtin (look for it here) which find can't exec for you.

share|improve this answer

Your Answer

 
discard

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.