我确定我错过了一些东西,但我无法理解。给出:
$ 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
答案 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 {}
。因此,当find
与exec
和echo
文件一起使用
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