0

在 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"

我对此感到很困惑。

4

3 回答 3

4

shell 在启动之前在反引号之间执行命令find

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

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

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

./FOO ./foo ./FOO

第二个命令也首先执行反引号之间的find命令,因此为第二个命令行实际执行的命令是:

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

应该并且确实 echo ./FOO

于 2013-09-18T14:59:49.613 回答
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]
于 2013-09-18T15:01:35.370 回答
0

您的 -exec 语法错误。用这个:

find . -name FOO -exec bash -c "echo -n {}; echo ' ./FOO' {} | tr '[A-Z]' '[a-z]'" \;
./FOO ./foo ./foo
于 2013-09-18T15:00:39.790 回答