find命令中-exec的奇怪行为

时间:2013-09-18 14:54:12

标签: bash

在Linux下的bash shell中找到(GNU findutils)4.4.2,我写道:

touch FOO
find . -name FOO -exec echo {} `echo ./FOO {} | tr [A-Z] [a-z]` \;

我得到了

./FOO ./foo ./FOO

为什么输出与./FOO ./foo ./foo?

不同

缩小问题范围:

find . -name FOO -exec echo `echo {} | tr [A-Z] [a-z]` \;

产生"./FOO"而不是"./foo"

我很困惑。

3 个答案:

答案 0 :(得分:4)

shell在启动find之前在后退之间执行命令。

因此,为您的第一个命令行实际执行的find命令是:

find . -name FOO -exec echo {} ./foo {} \;

这应该会给你你看到的输出:

./FOO ./foo ./FOO

第二个命令也首先在back-ticks之间执行命令,因此对第二个命令行实际执行的find命令是:

find . -name FOO -exec echo {} \;

应该并且确实会回复./FOO

答案 1 :(得分:1)

在执行find命令之前执行命令替换。这意味着你的初始命令

find . -name FOO -exec echo {} `echo ./FOO {} | tr [A-Z] [a-z]` \;

实际上变成了

find . -name FOO -exec echo {} ./foo {} \;

导致

./FOO ./foo ./FOO

如果要在查找结果上执行任意shell代码,请调用shell:

find -name FOO -exec bash -c 'echo "$1" | tr [A-Z] [a-z]' -- {} \;

(请注意,如果在当前目录中搜索,则不需要.

当然,如果您所做的只是转换为小写,那么最好这样做:

find -name FOO | tr [A-Z] [a-z]

答案 2 :(得分:0)

您的-exec语法错误。使用此:

find . -name FOO -exec bash -c "echo -n {}; echo ' ./FOO' {} | tr '[A-Z]' '[a-z]'" \;
./FOO ./foo ./foo