Why using dirname in find command gives dots for each match?

前端 未结 7 1469
清酒与你
清酒与你 2021-02-01 15:16

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

7条回答
  •  粉色の甜心
    2021-02-01 15:26

    Consider the following script:

    #!/bin/sh
    set -x
    find `pwd` -name "file.ext" -exec echo $(dirname {}) \;
    

    set -x shows how the expansion works and what the final command is. When run, it gives the following output:

    ++ pwd
    ++ dirname '{}'
    + find /home/kibab -name file.ext -exec echo . ';'
    

    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 basename for dirname, the expansion still takes places, but the results of the expansion are different:

    1. pwd is expanded to the current path. In my example above, the result is /home/kibab

    2. basename {} is executed. The result of this command is {}.

    3. 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?

    find `pwd` -name "file.ext" -printf "%f\n"
    

提交回复
热议问题