find -exec basename {} vs find -exec echo $(basename {})

时间:2017-02-16 19:45:43

标签: bash

我确定我错过了一些东西,但我无法理解。给出:

$ find -type f
./hello.txt
./wow.txt
./yay.txt

接下来的两个命令如何呈现不同的结果?

$ find -type f -exec basename {} \;
hello.txt
wow.txt
yay.txt

$ find -type f -exec echo $(basename {}) \;
./hello.txt
./wow.txt
./yay.txt

2 个答案:

答案 0 :(得分:3)

在命令运行之前评估

$(basename {})。结果是{}所以命令echo $(basename {})变为echo {},并且不为每个文件运行basename。

答案 1 :(得分:2)

使用bash -x调试器进行的快速调试证明了这一点,

[该示例是我自己的,仅用于演示目的]

bash -xc 'find -type f -name "*.sh" -exec echo $(basename {}) \;'
++ basename '{}'
+ find -type f -name '*.sh' -exec echo '{}' ';'
./1.sh
./abcd/another_file_1_not_ok.sh
./abcd/another_file_2_not_ok.sh
./abcd/another_file_3_not_ok.sh

仅适用于basename {}

bash -xc 'find -type f -name "*.sh" -exec basename {} \;'
+ find -type f -name '*.sh' -exec basename '{}' ';'
1.sh
another_file_1_not_ok.sh
another_file_2_not_ok.sh
another_file_3_not_ok.sh

正如您在第一个示例中所看到的,echo $(basename {})分两步解决,basename {}只是实际文件上的basename(输出普通文件名)然后被解释为echo {}。因此,当findexececho文件一起使用

时,它只是模仿了确切的行为。
bash -xc 'find -type f -name "*.sh" -exec echo {} \;'
+ find -type f -name '*.sh' -exec echo '{}' ';'
./1.sh
./abcd/another_file_1_not_ok.sh
./abcd/another_file_2_not_ok.sh
./abcd/another_file_3_not_ok.sh