I’m using find for a task and I noticed that when I do something like this:
find `pwd` -name "file.ext" -exec echo $(dirname {}) \;
it will give you dots only for each match. When you substitute dirname with basename in that command you get the full pathnames. Am I screwing something up here or is this expected behavior? I’m used to basename giving you the name of the file (in this case file.ext) and dirname giving you the rest of the path.
Consider the following script:
set -xshows how the expansion works and what the final command is. When run, it gives the following output:So, the first thing that is expanded is the
pwd. Second is$(dirname {}). The result of those two commands is then dropped into the find command. Thus, you’re telling find to-exec echo ., so you’re seeing the expected output.When you substitute
basenamefordirname, the expansion still takes places, but the results of the expansion are different:pwdis expanded to the current path. In my example above, the result is/home/kibabbasename {}is executed. The result of this command is{}.The find command is executed with the above substitutions in place. The final command executed looks like this:
find /home/kibab -name '*.png' -exec echo '{}' ';'Upon inspecting the above command, you’ll notice that the command now simply echo’s whatever file was found.
Perhaps you want something like this?